我正在尝试使用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/