我正在尝试使用 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];
最佳答案
您是否在CAEAGLLayer
中使用kEAGLDrawablePropertyRetainedBacking
?如果您不将其设置为 YES
,则无法保证在渲染后保留缓冲区的内容。换句话说,他们正在进行双缓冲渲染:有 2 个独立的缓冲区。一种正在显示,一种正在渲染。当渲染一帧并显示它时,下一帧将渲染到另一个缓冲区,因此不会保留内容。 (这解释了为什么如果您不清除屏幕的那 block 内容,您会看到垃圾。)如果您使用此标志,图形系统可能会在翻转期间复制数据,以便保留内容。
使用此标志将使您的应用程序占用更多内存和更多时间来渲染,因此对于上面的优化来说可能不值得。您必须对其进行分析并查看。 (有关更多信息,请参阅 the Apple docs。)
您还可以查看 GLPaint demo - 它使用此属性来避免每次都重绘屏幕。
关于iphone - glScissor 帮助 (iPhone OpenGL ES),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686277/