我正在尝试使用glScissor来仅隔离需要更新的屏幕部分。
我有一个游戏区域,需要更新每一帧,但UI区域的更新频率要低得多。游戏区域很好,但UI区域不断闪烁着看似旧的缓冲区数据。

我想念什么?

这是我的渲染代码:

[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

if (needsUIUpdate)
{
   // clear entire screen
   glScissor(0, 0, 320, 480);

   glClear(GL_COLOR_BUFFER_BIT);

   needsUIUpdate = NO;
   [self updateUI];
}
else
{
   glScissor(0, 80, 320, 400);
   glClear(GL_COLOR_BUFFER_BIT);
}

for (Cell* c in allCells)
   [c animate];

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

最佳答案

您是否在kEAGLDrawablePropertyRetainedBacking中使用CAEAGLLayer?如果未将其设置为YES,则渲染后不能保证保留缓冲区的内容。换句话说,他们正在做双缓冲渲染:有2个单独的缓冲区。正在显示一个,正在渲染一个。渲染一帧并显示时,下一帧将渲染到另一缓冲区,因此不会保留内容。 (这将解释为什么不清除屏幕的那一部分会看到垃圾。)如果使用此标志,则图形系统可能会在翻转期间复制数据,从而保留了内容。

使用此标志会使您的应用占用更多的内存和更多的时间进行渲染,因此对于上面的优化可能不值得。您必须对其进行分析并查看。 (有关更多信息,请参见the Apple docs。)

您还可以看一下GLPaint演示-它使用此属性来避免每次重画屏幕。

关于iphone - glScissor帮助(iPhone OpenGL ES),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/686277/

10-09 08:04