我正在开发一个应用程序,它需要使用 OpenGL 进行绘制,刷新率至少等于显示器的刷新率。我需要在单独的线程中执行绘图,以便绘图永远不会被激烈的 UI 操作锁定。
实际上我正在使用NSOpenGLView
结合CVDisplayLink
我可以毫无问题地达到 60-80FPS。
因为我还需要在这个视图之上显示一些可可控件,所以我尝试子类化NSOpenGLView
并使其成为分层支持的,如下图层支持的OpenGL视图 https://developer.apple.com/library/mac/#samplecode/LayerBackedOpenGLView/Introduction/Intro.html苹果的例子。
结果并不令人满意,我得到了很多伪影。
因此我使用单独的方法解决了这个问题NSWindow
托管可可控件并将此窗口添加为包含以下内容的主窗口的子窗口NSOpenGLView
。
它运行良好,我能够获得与初始实现完全相同的 FPS。
因为我认为这个解决方案很像一个肮脏的黑客,所以我正在寻找一种替代的、更干净的方法来实现我所需要的。
前几天我遇到了NSOpenGLLayer
我认为它可以作为解决我的问题的可行解决方案。
最后,在所有的序言之后,我的问题是:
是否有可能绘制到NSOpenGLLayer
从一个单独的线程使用CVDisplayLink
打回来?。
到目前为止,我已经尝试实现这一点,但我无法从中提取CVDisplayLink
打回来。我只能-setNeedsDisplay:TRUE
on the NSOpenGLLayer
来自CVDisplayLink
回调然后执行绘图-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
当它被可可自动调用时。但我想这样我是从主线程中绘制的,不是吗?
谷歌搜索后我什至发现this http://youfaqs.com/201127316/mailing-list/help-needed-for-the-nsopengllayer-behavior-under-lion.html帖子中用户声称狮子下的绘图只能发生在内部-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
.
我目前使用的是 Snow Leopard,但该应用程序即使在 Lion 上也应该可以完美运行。
我错过了什么吗?