【问题标题】:Mac Mojave + openglMac Mojave + opengl
【发布时间】:2019-11-07 23:20:45
【问题描述】:

Mac OS 10.14 Mojave 刚刚发布,自 6 月以来,我们就知道 OpenGL 将在操作系统中被弃用。 “OpenGL 应用程序将继续运行,但你应该切换到 Metal,”来解释一下。 但是,似乎没有任何文档表明您是否仍然可以使用 OpenGL编译,或者 Apple 是否会阻止或省略适当的开发库。我目前正在开发一个基于 OpenGL 的图形程序,如果编译不再起作用,我不能冒险更新。有人测试过吗?

编辑:还有其他人分享 Esentel 的经验吗?

【问题讨论】:

  • 我的应用程序在 10.14 / Xcode 10 上使用 OpenGL 构建、运行和渲染都很好。
  • @TheNextman 你对其他人为什么遇到问题有任何想法吗?
  • 我怀疑早期版本中没有出现的编程错误 :) 没有更多细节很难说。我会注意到我在控制台中看到了@Esentel 链接中提到的警告。我在启动时看到它,并相信它完全是良性的(或者至少是红鲱鱼)。我能给出的最佳建议是备份、升级、试用。如果它不起作用,您可以在解决问题时回滚到备份。
  • 我得到一个像 Esentel 和 @Marcus Åkerman 一样的黑屏,我正在使用 SDL2,如果我拖动窗口,渲染就会出现,之后一切都很好。我会研究他提到的 SDL 修复。
  • 这里也一样。 Chris (reshape) 发布的解决方法解决了我的问题。

标签: macos opengl deprecated macos-mojave


【解决方案1】:

我可以编译,但是在更新到最新的 Mojave 和 Xcode 后,我的 OpenGL 应用程序根本无法工作。

在一种情况下,我在系统 GL 调用期间遇到了挂起,在另一种情况下只是黑屏。 输出中的一些错误与此处相同: https://stackoverflow.com/questions/52507950/unable-to-load-info-plist-error-xcode-10-under-macos-10-14-mojave#=

我建议你不要更新。

我认为 Xcode 10 OpenGL 库中有一些问题。

编辑:似乎后来的 Mac OS 和 Xcode 更新已经解决了这些问题。

【讨论】:

  • 哎呀,这实际上非常糟糕。我预计事情至少会持续一段时间。
  • 我仍然需要在 high sierra(该操作系统附带的硬件)上设置工具。我还能在那里获得 XCode 9 吗?
  • 看来我可以在9和10之间随意切换。我不确定我是否应该坚持使用 9。
  • 在 1 月 23 日左右的 Mojave 10.14.3 更新后,“后来的 Mac OS 和 Xcode 更新已修复问题”的评论是否仍然有效?如果我使用 Xcode 10.1,我不会得到任何渲染。如果我使用 Xcode 9.4.1 构建,一切都很好。
  • 我确认更新到 Mojave 10.14.3 和 Xcode 10.1 后,此问题已得到修复。无需为使此代码运行而做一些小技巧。
【解决方案2】:

GLFW 解决方法。与其他答案类似,但您无需在绘图循环中调整窗口大小,只需先调用glfwPollEvents()

window = glfwCreateWindow(width-1, height, "Hello World", NULL, NULL);
glfwPollEvents();
glfwSetWindowSize(window, width, height);

另外,glfwHideWindow() 然后glfwShowWindow() 似乎工作。同样glfwSetWindowPos() 是一个替代方案。虽然设置窗口大小似乎比隐藏/显示窗口要快,但我不想移动窗口位置。

【讨论】:

    【解决方案3】:

    代码在

    http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp

    在 Mojave 中使用 Xcode 10.0 可以正常工作。窗口会自动调整大小以消除黑色。 OpenGL 和 GLUT 框架从通常的位置 /System/Library/Frameworks 添加到项目中

    克里斯

    【讨论】:

      【解决方案4】:

      我正在使用 GLEW、GLUT、OpenGL 2.0 和 SDL 2。我可以编译和运行我的 OpenGL 应用程序。但是我不得不更改我的框架搜索路径以包括:

      /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks

      现在放置了 OpenGL 和 GLUT 框架 + 标头,因为我在旧的搜索路径 System/Library/Frameworks 中找不到任何 OpenGL/GLUT 标头(尽管框架仍然存在,但没有包含标头)。我还必须确保我的包含是 GLUT/glut.h 而不仅仅是 glut.h。

      这给了我以下形式的新警告消息:

      [默认]无法加载Info.plist异常(eGPUOverrides)”和“保存的启用降噪设置与默认相同(=1)

      我还没有检查它们,它们的含义是什么。

      真正困扰我的是 Esentel 所说的,编译和运行应用程序后只有一个黑屏。我发现如果你拖动应用程序窗口(我没有使用全屏),那么动画就会开始显示。显然动画在后台,所有代码都在评估,但是在我拖动窗口之前只有一个黑屏。

      编辑:我正在使用 Mojave 和 Xcode 10(不是测试版)。

      【讨论】:

      • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
      • mustaccio:我的回答没有任何问题。我不明白你的意见。我回答了同步器的问题,陈述了我使用 Mojave 将应用程序从 9+ 和 High Sierra 升级到 10+ 时的经验。
      • @MarcusÅkerman 也许这是一个垃圾邮件机器人。无论如何,看起来 Apple 没有包含正确的标题。黑窗错误出现在 SDL 的末尾。它已在最前沿的分支中修复,但您现在必须自己编译它。顺便说一句,我不会使用 Xcode,我使用的是 SDL2、GLEW 和 OpenGL 4.1
      • @synchronizer,我拉动了 libSDL master 的前沿并重建了我的 libSDL,但它没有帮助。我看到了变更集#12261,这看起来很可能是修复,但我仍然有一个黑色的窗口,直到我拖动它。我在新代码的断点处停了下来,以确保我成功了。我是。在中断后恢复并禁用断点时,窗口正常绘制。无论是从 Xcode 运行还是直接运行应用程序都会出现问题。
      • 我对这个答案投了反对票,因为我能够在不更改框架搜索路径的情况下进行构建。然而,在我这样做之后,我意识到我的包包含 OpenGL 头文件,因此只使用框架进行链接。我试图扭转否决票,但单击向上箭头会使其跳到 +1,而不是停在 0。
      【解决方案5】:

      我正在使用 GLUT 和 OpenGL。 Xcode 10.0 和 10.1 beta3 都存在此问题。

      如果您调整窗口大小,图形会在大部分时间出现。

      所以我设计了一个使用 reshape 回调函数的解决方法。假设我想激活一个 1000x1000 的窗口。我用 999x999 激活它,然后在 reshape 时根据需要将其设置为 1000x1000:

      void reshape (int width, int height){
          glutReshapeWindow (1000, 1000);
      }
      

      主要是:

      int main (int argc, char** argv)
      {
          glutInit(&argc,argv);
          glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
          glutInitWindowSize( 999,999 );
          glutInitWindowPosition (0.0f, 0.0f);
          glutCreateWindow("example");
      
          glutReshapeFunc (reshape);
          glutDisplayFunc(draw);
          glutKeyboardFunc(keyboard);
          glutIdleFunc(idle);
      
          glutMainLoop();
          return 0;
      }
      

      由于 reshape 回调是在显示之前触发的,所以它现在正在工作。

      【讨论】:

      • 我不建议使用 glut。
      【解决方案6】:

      截至今天(2018 年 10 月 21 日),Mojave 中的 OpenGL 存在漏洞。您必须移动 glfw 窗口位置才能真正看到它正在呈现的内容。

      渲染循环中的这个解决方法代码对我有用:

      if(!init)
      {
          int x,y;
          glfwGetWindowPos(window,&x, &y);
          glfwSetWindowPos(window,x+1,y);     
          init = true;
      }
      

      【讨论】:

      • 非常感谢!我使用 mittsu 的 Ruby 库来完成这项工作,它包装了 glfw。这是我正在使用的 Ruby 代码:gist.github.com/ndbroadbent/503f0dc32077a53d32f70673c40df4c7
      • 一个建议:可以在渲染循环之前移动窗口,避免不必要的if语句。
      • 不幸的是,在 glfwSwapBuffers(window) 和 glfwPollEvents() 调用完成后,这段代码需要在渲染循环中。否则不会有效果。
      【解决方案7】:

      某些 OpenGL 代码失败的原因是在 Mojave 中,您的视图会自动支持图层。如果您的代码正在测试这种情况:

      [NSGraphicsContext currentContextDrawingToScreen]
      

      它会返回 NO 并且该条件下的代码将不会运行(即:屏幕上没有绘制任何内容)。

      很遗憾,您也不能在 Mojave 中将 WantsLayer 设置为 NO,这将不起作用。

      【讨论】:

      • 什么会触发 OpenGL 中的检查?
      • 这不是系统触发的检查,但有时该代码是从 Apple 的示例代码中复制和粘贴的。修复方法是在 Xcode 10 中编译时不检查 currentContextDrawingToScreen。
      • 但我认为我们中的任何人都没有明确地使用 Objective-C。我也没有使用 ide。
      【解决方案8】:

      通过下载 Xcode 9.4.1“修复”了这个问题

      在其中编译并让我的应用程序与 OpenGL 视图正常工作。

      我认为这与Layer-Backed Views 有关。 因为当我滚动我的 OpenGL 视图时,它在某些视图下变得可见......并且闪烁。我看到它在后面正确绘制。但是当我停止滚动时 - 它消失了。

      【讨论】:

        【解决方案9】:

        我在 GLFW 中的解决方法是在主绘制循环中调用显示窗口。

         bool needDraw = true;
            if (needDraw) {
                glfwShowWindow(window);
                glfwHideWindow(window);
                glfwShowWindow(window);
                needDraw = false;
            }
        

        【讨论】:

          【解决方案10】:

          我在更新后也遇到了这个问题。我正在使用glfw。实际上,创建的窗口可以在调整大小或移动后显示所需的内容。我在主循环中添加了glfwSetWindowPos(window, 100, 100); 以将其移动以作为临时解决方案。

          【讨论】:

            【解决方案11】:

            在某些情况下,将窗口坐标移动 +1 不起作用。 在这种情况下,我们以编程方式连续拖动窗口,直到它被渲染并通过键盘按下停止屏幕。交换缓冲区后将其添加到游戏循环中。

                if (glfwGetKey( window, GLFW_KEY_Q ) == GLFW_RELEASE && !mac_moved){
                    int x, y;
                    glfwGetWindowPos(window, &x, &y);
                    glfwSetWindowPos(window, ++x, y);
                } else {
                    mac_moved = true;
                }
            

            将 mac_moved 定义为顶部某处的静态变量。

            static bool mac_moved = false;
            

            【讨论】:

              猜你喜欢
              • 2019-04-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-10
              • 2019-07-14
              • 2019-04-01
              相关资源
              最近更新 更多