【发布时间】:2020-07-19 16:16:42
【问题描述】:
我已经构建了一个小型 Cocoa 应用程序,它使用 OpenGL 来绘制一些浅色内容。我用过 CAOpenGLLayer。虽然该应用程序本身非常小并且运行速度极快,但该应用程序的启动时间并不能令人满意。在显示内容之前,应用程序会在启动时随机停顿大约一两秒。
我已经缩小了问题范围,发现瓶颈是在 OpenGL 初始化期间调用的 CGLChosePixelFormat() 函数。从字面上看,它需要大约 1 秒的时间来执行。
为了一个干净的实验,我创建了一个空白的 Cocoa 应用程序,并在窗口中添加了一个 NSOpenGLView。出于同样的原因,应用启动时间立即增加了 1-2 秒。
有没有办法解决这个问题?似乎没有办法避免使用 CGLChosePixelFormat(),这对于让 OpenGL 在 Mac 上工作至关重要。
另外,据说 Core Animation 是在 OpenGL 的底层构建的,但我的 Core Animation 应用程序根本没有出现这种启动缓慢的问题。另外,我在 Core Animation 应用程序中尝试了 CGLChosePixelFormat 上的符号断点,但它没有触发。所以 Core Animation 要么不使用 OpenGL,要么有办法以不同的方式初始化它。有人有解决办法吗?
附:我知道 Metal 现在是在 Mac 上实现 3D 图形的方式,但出于向后兼容性的原因,我需要在 OpenGL 上执行这个特定项目。
【问题讨论】:
-
尝试使用
NSOpenGLPixelFormatAttribute(以0结尾的常量列表)并通过initWithAttributes设置它们,如Apple docs 的清单6-2。如果它返回 NULL 那么你应该改变一些属性然后再试一次。 -
不幸的是它没有帮助。 initWithAttributes 方法在内部调用了 CGLChosePixelFormat,所以我们回到第一个问题。
-
有趣的是,这个问题只是偶尔出现。我在 MacBook Pro 16" 2019 上进行测试。大多数情况下,CGLhoosePixelFormat 花费的时间可以忽略不计。但是有时,它开始需要大约 1 秒,并且每次应用启动时问题都会持续一段时间。然后又回到零时间。我认为它可以与切换内部图形硬件(集成/分离?)有关。
标签: objective-c macos cocoa opengl core-animation