2012-02-25 34 views
3

我正在研究一个应用程序,需要使用OpengGL绘制刷新率至少等于显示器的刷新率。而且我需要在单独的线程中执行绘图,以便绘图不会被强烈的UI操作锁定。从与NSOpenGLLayer单独线程绘制

其实我使用NSOpenGLViewCVDisplayLink结合,我能达到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:内。

我现在在雪豹上,但即使在狮子上,应用程序也应该完美无瑕地运行。

我错过了什么吗?

回答

4

是的,这是可能的,但不建议。从您的CVDisplayLink内的图层上调用display。这将导致canDrawInContext:...被调用,如果它返回YES,drawInContext:...将被调用,并且所有这些在任何线程上调用display。要在屏幕上显示渲染图像,您必须致电[CATransaction flush]。这个方法已经在Apple邮件列表中提出,尽管它不是完全无问题的(其他视图的显示方法也可能在后台线程上调用,并且并非所有视图都支持从后台线程进行渲染)。

推荐的方法是使图层异步并在主线程上呈现OpenGL上下文。如果不能达到良好的帧率这样一来,因为你的主线程正忙于其他,它是建议(使用大中央调度EG),而移动一切(几乎整个应用程序逻辑)到其他线程,并只保留用户输入和在主线上绘制代码。如果你的窗户非常大,你可能仍然没有比30 FPS更好的效果(一次刷新两次屏幕),但这来自于事实,CALayer的构成似乎是一个相当昂贵的过程,它已经或多或少的进行了优化静态图层(例如包含图片的图层),而不是图层更新60 FPS。

E.g.如果您正在编写3D游戏,建议您不要混淆CALayers与OpenGL内容。如果您需要Cocoa UI元素,请将它们与OpenGL内容分开(例如,将窗口水平分割为仅显示OpenGL的部分和仅显示控件的部分),或者自行绘制所有控件(这对游戏来说很常见)。

最后但并非最不重要的一点,这两种窗口方式并不像您想象的那样充满异国情调,这就是VLC(视频播放器)如何在视频图像上绘制控件(也由Mac上的OpenGL呈现)。

+0

谢谢!目前的应用程序也是一个视频播放器。我不知道VLC使用子窗口来控制它,我从来没有看过它的源代码。虽然子窗口解决方案似乎在iMac上运行良好,但另一方面,它似乎在2009年的MacBook上会出现一些图形问题。但我不确定这些问题是否与子窗口或其他相关。我会尝试你在我的其他问题上建议的解决方案,如果它不会提供更好的性能,我会坚持使用控制的子窗口。非常感谢你!! – Andrea3000 2012-07-12 15:52:30

+0

我将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