使用图层支持的NSOpenGLView大幅减速

时间:2011-05-18 03:46:29

标签: cocoa opengl core-animation layer

我需要在现有应用程序的NSOpenGLView上显示一些Cocoa小部件。我按照Apple的LayerBackedOpenGLView示例代码中的示例进行了操作。使用以下内容为NSOpenGLView提供了支持层:

[glView setWantsLayer:YES]

然后将带有小部件的Cocoa NSView添加为glView的子视图。这基本上是有效的,并且是我之前的方法的两倍,我将包含小部件的NSView添加到包含glView的窗口的子窗口(这是我在网络上找到的另一个解决方案)。

有两个问题。

  • 首先,我使用混合的一些纹理不再正确混合。在搜索了一下后,看起来我可能需要清除OpenGLView的alpha通道。我在绘制框架后调用的这段代码似乎解决了这个问题:

代码:

glColorMask(FALSE, FALSE, FALSE, TRUE); //This ensures that only alpha will be effected
glClearColor(0, 0, 0, 1); //alphaValue - Value to which you need to clear
glClear(GL_COLOR_BUFFER_BIT);
glColorMask(TRUE, TRUE, TRUE, TRUE); //Put color mask back to what it was.

有人可以解释为什么在使用CALayer时需要这样做,但不是没有?

  • 第二个问题我没有解决方案。似乎当我平移到观察到问题#1的场景的部分时,帧速率从110 FPS下降到10 FPS。同样,这仅在我添加背衬层后才开始发生。这并不总是发生。有时候在场景的这一部分进行平移时FPS保持很高但这种情况很少见。我认为它必须与这里的纹理混合有关,但我不知道是什么。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我确实找到了减速的解决方法。 OpenGL视图有一个HUD(抬头显示)视图。我已经安装了另一个NSView作为子视图。 HUD和子视图都有很多alpha操作,并且由于某种原因,在合成图层时发生了真正的减速。我可以轻松地将这个子视图安装为OpenGL视图的子视图,当我这样做时,一切都再次加速。因此,虽然我并不完全了解减速,但我确实有很好的解决方法。