我正在研究一个应用程序,需要使用OpengGL绘制刷新率至少等于显示器的刷新率。而且我需要在单独的线程中执行绘图,以便绘图不会被强烈的UI操作锁定。从与NSOpenGLLayer单独线程绘制
其实我使用NSOpenGLView
与CVDisplayLink
结合,我能达到60-80FPS没有任何问题。
因为我还需要在这个视图之上显示一些可可控件,所以我尝试了NSOpenGLView
的子类,并使它成为层支持的,下面是LayerBackedOpenGLView Apple示例。
结果不令人满意,我得到了很多文物。
因此,我已经解决了使用一个单独的NSWindow
举办可可控件和添加该窗口包含NSOpenGLView
主窗口的子窗口的问题。 它工作正常,我能够获得与初始实施相同的FPS。
由于我认为这个解决方案很像一个肮脏的黑客,我正在寻找一种替代和更干净的方式来满足我的需求。
几天前我遇到了NSOpenGLLayer
,我认为它可以作为我的问题的可行解决方案。
因此,最后,在所有这些序言之后,我的问题来了: 是否可以使用CVDisplayLink
回调函数从单独的线程抽取到NSOpenGLLayer
。
到目前为止,我试图实现这一点,但我无法从CVDisplayLink
回调中绘制。我只能从CVDisplayLink
回调调用NSOpenGLLayer
上的-setNeedsDisplay:TRUE
,然后在-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
中执行图形时,它会被cocoa自动调用。但我想这是我从主线上画的,不是吗?
谷歌搜索后,我甚至发现this后,其中用户声称,狮子画下只能发生在-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
内。
我现在在雪豹上,但即使在狮子上,应用程序也应该完美无瑕地运行。
我错过了什么吗?
谢谢!目前的应用程序也是一个视频播放器。我不知道VLC使用子窗口来控制它,我从来没有看过它的源代码。虽然子窗口解决方案似乎在iMac上运行良好,但另一方面,它似乎在2009年的MacBook上会出现一些图形问题。但我不确定这些问题是否与子窗口或其他相关。我会尝试你在我的其他问题上建议的解决方案,如果它不会提供更好的性能,我会坚持使用控制的子窗口。非常感谢你!! – Andrea3000 2012-07-12 15:52:30
我将performSelectorOnMainThread与CVDisplayLink结合使用。它效果很好。如果您使用CATransaction .Flush,如果尝试将用户交互与框架动画结合使用,则会遇到问题。它可以被使用,但你必须在将来的所有代码中对它进行解释。方法更容易使用performSelectorOnMainThread方法。这里是我和Mecki之间的一个convo,也是我在这个问题上的发现:http://chat.stackoverflow.com/rooms/104337/opengl-on-macos-x-and-threading也会爱你对这个Mecki的最终评论。再次感谢。 – eonist 2016-03-09 07:08:47