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