3

我正在尝试使用 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];
4

2 回答 2

4

kEAGLDrawablePropertyRetainedBacking在你的使用CAEAGLLayer吗?如果您不将此设置为YES,则不能保证在渲染后保留缓冲区的内容。换句话说,他们正在进行双缓冲渲染:有 2 个单独的缓冲区。一个正在显示,一个正在渲染。当您渲染一帧并显示它时,下一帧将渲染到另一个缓冲区,因此不会保留内容。(这就解释了为什么如果你不清除那块屏幕,你会看到垃圾。)如果你使用这个标志,图形系统可能会在翻转过程中复制数据,以便保留内容。

使用此标志将使您的应用程序占用更多内存和更多时间来渲染,因此对于上述优化可能不值得。您必须对其进行分析并查看。(有关更多信息,请参阅Apple 文档。)

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

于 2009-03-27T10:58:58.887 回答
1

你绝对错过了:

glEnable(GL_SCISSOR_TEST);

虽然我不确定这是否足以解释您所看到的文物,但只是想指出这一点。根据文档,默认情况下未启用剪刀测试。

于 2009-03-27T10:39:57.277 回答