2008-10-16 57 views
3

我为使用OpenGL ES的iPhone制作了一个简单的游戏。一切工作正常,除了这个问题:当我第一次打开手机时,为什么我的OpenGL ES iPhone游戏闪烁?

我打开手机完全脱落,然后再打开,然后启动我的应用程序,我得到这个奇怪的闪烁!其他每一帧都是正确的......不正确的帧是一遍又一遍的相同帧。如果我退出应用程序,再次启动它一切都很好。如果我退出并连续重启10次,每次都很好。

但是如果我关闭手机,然后再打开,然后启动应用程序,我会得到相同的闪烁,我第一次启动该应用程序。

这是怎么回事?

有没有其他人有这个问题?

干杯!

回答

3

苹果发布有关此问题的其他信息:

问:我的OpenGL ES应用闪烁。 特别是在iPhone 3GS, 上运行时,似乎每隔 帧都会发生闪烁。我该如何解决这个问题?

答:默认情况下, 渲染的内容,它 呈现给屏幕(后通过调用 -EAGLContext/presentRenderbuffer :)无效。每当您绘制一个 帧时,您的应用程序必须完全重绘 渲染缓冲区的内容,否则您可能会观察到 闪烁或其他意外的 结果。

您必须为屏幕上的每个 像素提供一种颜色。在您的绘图代码的开头 ,这是一个很好的 想法使用glClear()初始化颜色缓冲区 。一个全屏清晰的 你的每个颜色,深度和 模板缓冲区(如果你正在使用它们) 在一帧的开始也可以 通常提高你的应用程序的 的性能。

如果您的应用程序需要的帧之间保持 提拉内容, 你可以选择 kEAGLDrawablePropertyRetainedBacking = YES添加到您的CAEAGLLayer对象的 drawableProperties财产。使用 此选项需要额外的内存 ,并可能降低您的应用程序的 性能。

1

嗯。我没有在iPhone上使用OpenGL做很多事情,但我不得不说我没有注意到其他应用程序的这种行为。我怀疑这与你如何切换活动帧缓冲器有关。

也许看看一些示例代码,看看你在做什么不同?

+0

FWIW,我刚刚在我的iPhone上尝试了自己的OpenGL应用程序,但没有看到任何问题。 – 2008-10-16 21:51:03

1

是否有可能您正在调用glRenderBuffer()并将presentRenderBuffer消息发送到您的EAGLContext,而没有执行任何OpenGL更新,即没有新的glDrawElements或glDrawArrays。如果您在没有将kEAGLDrawablePropertyRetainedBacking设置为YES的情况下执行此操作,则可能会出现恼人的闪烁。

拿上你的CAEAGLLayer的drawableProperties财产一脸的kEAGLDrawablePropertyRetainedBacking。该属性确定了可绘制表面在显示其内容后的行为。如果此属性设置为NO,则内容不会保留,因此不能保证在显示后保持不变。如果将其设置为YES,则内容将保留并在显示后保持不变。

我认为将kEAGLDrawablePropertyRetainedBacking设置为YES会掩盖问题,但无法解决问题。

1

我相信这个问题已经与当iPhone OS采用应用程序(锁定和恢复或警告弹出窗口)的控制出现顶点缓冲腐败做。我也有这个问题,但还没有找到合适的解决方法,它似乎是场景中的一个或多个对象。我们使用纹理地图集,并且没有任何共享纹理的其他对象似乎受到影响。也许销毁和重建你的顶点缓冲区将解决这个问题。

1

我曾与当前图像和固定图像之间的闪烁/闪烁交替同样的问题......它会发生在3GS,而不是3G,第一代,或者模拟器。

对我来说,当我会成立于ESRenderer的背景下,但在下面的[现场抽奖]没有引起某些州的任何代码实际上没有画任何东西,即问题引起的。在旧的iPhone和Sim上,当你没有画任何东西的时候,它似乎没有翻转OpenGL缓冲区......但是在3GS上它却有。无论如何,我的解决方法是在这些状态下停止动画(即停止调用绘制rountine的定时器),当我不绘制任何东西时。

- (void) draw 
{ 
    [EAGLContext setCurrentContext:context]; 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight); 

    //Render the GLScene... 
    [scene draw]; 

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 
相关问题