我正在开发一个应用程序,该应用程序需要以至少等于显示器刷新率的刷新率使用 OpengGL 进行绘制。而且我需要在单独的线程中执行绘图,以便绘图永远不会被激烈的 UI 操作锁定。
实际上,我正在使用 a NSOpenGLView
,CVDisplayLink
并且我能够毫无问题地达到 60-80FPS。
由于我还需要在此视图之上显示一些可可控件,因此我尝试按照LayerBackedOpenGLView Apple 示例进行子类NSOpenGLView
化并使其具有图层支持。
结果并不令人满意,我得到了很多工件。
因此,我已经解决了这个问题,使用单独NSWindow
的可可控件托管并将此窗口添加为包含NSOpenGLView
. 它工作正常,我能够获得与初始实现完全相同的 FPS。
由于我认为这个解决方案很像一个肮脏的黑客,我正在寻找一种替代的、更干净的方式来实现我所需要的。
几天前我遇到了NSOpenGLLayer
,我认为它可以用作解决我的问题的可行解决方案。
所以最后,在所有这些序言之后,我的问题来了:是否可以使用回调NSOpenGLLayer
从单独的线程中绘制到 a ?CVDisplayLink
到目前为止,我已经尝试实现这一点,但我无法从CVDisplayLink
回调中提取。我只能-setNeedsDisplay:TRUE
在回调中执行绘图,然后在NSOpenGLLayer
可可自动调用它时执行绘图。但我想这样我是从主线程中绘制的,不是吗?CVDisplayLink
-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
在谷歌搜索之后,我什至发现了这个帖子,其中用户声称在 Lion 下绘图只能发生在里面-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
。
我目前在 Snow Leopard 上,但即使在 Lion 上,该应用程序也应该可以完美运行。
我错过了什么吗?