iphone - glScissor 帮助 (iPhone OpenGL ES)

标签 iphone cocoa-touch opengl-es

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

相关文章:

ios - 图像在 ios 模拟器中看起来与在照片预览中不同

ios - 如何在 XCode 中复制文件?

android - 缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵

c++ - 有条件地使用 OpenGL 扩展

ios - 如何在 Objective-C 中的 UICollectionView 的 didSelectItemAtIndexPath 委托(delegate)上显示 UIProgressView?

iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣

iphone - Xcode 中的 #Import <AppKit/AppKit.h> 出现问题

javascript - 实例化多个对象会降低 WEBGL 应用程序的帧速率

javascript - 如何添加 jquery 移动加载掩码

iphone - 如何从 ZXing 获取原始字节 - iPhone