glClear()如何提高性能?

时间:2010-03-29 14:29:54

标签: iphone opengl-es

Apple's Technical Q&A on addressing flickering (QA1650)包括以下段落。 (强调我的。)

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

在其他平台上,如果您要绘制每个像素,我总是发现它是清除颜色缓冲区的优化。 (如果你要覆盖那种清晰的颜色,为什么要浪费时间填充颜色缓冲区?)

如何调用glClear()来提高性能?

4 个答案:

答案 0 :(得分:15)

很可能与基于图块的渲染相关,渲染将整个视口划分为图块(较小的窗口,通常尺寸为32x32),并且这些图块保存在更快的存储器中。这个较小的内存和实际的帧缓冲之间的复制操作可能需要一些时间(内存操作比算术操作慢很多)。通过发出glClear命令,您告诉硬件您不需要以前的缓冲区内容,因此不需要将帧缓冲区中的颜色/深度/任何内容复制到较小的区块内存中。

答案 1 :(得分:3)

从iOS 4的官方评论的长远角度来看,它已经公布了接受的答案......

我认为这应该与Apple关于GL_EXT_discard_framebuffer扩展的评论一起阅读,如果可能的话,应该始终在框架的末尾使用(实际上在其他地方)。丢弃帧缓冲区时,将其内容置于未定义状态。这样做的好处是,当你下一次绑定其他帧缓冲区时,永远不需要将缓冲区的当前内容存储到某个地方,类似下次恢复缓冲区时,不需要检索它们。这些应该都是GPU内存副本,因此相当便宜,但它们远非免费,iPhone的共享内存架构可能意味着更复杂的考虑因素可能会出现。

基于iOS的合成模型,可以合理地假设即使你的应用程序没有在其上下文中绑定和取消绑定帧缓冲区,GPU也必须至少对每个帧隐式执行一次这些任务。< / p>

我敢说这个驱动程序很聪明,如果你做的第一件事是清楚的,那么你可以获得丢弃扩展的一半好处而不实际使用它。

答案 2 :(得分:-2)

尝试在传递给ChooseConfig的glSurface属性中减小帧缓冲区的大小。

例如,将属性设置为最小值或完全省略它们以使用默认值,除非您有特定要求。

答案 3 :(得分:-4)

我绝对可以确认你必须为屏幕上的每个像素提供颜色

我在基于XCode的iPhone OpenGL模板构建的裸骨测试应用程序中验证了这一点:

[context presentRenderbuffer:GL_RENDERBUFFER];  
glClear( GL_COLOR_BUFFER_BIT );

如果我省略glClear行(或者在循环中进一步向下移动,在其他一些OpenGL调用之后),则线程(通过CADisplayLink运行)几乎不再获得任何更新。似乎CPU / GPU同步变得混乱并且线程被阻塞。 如果你问我,那就太可怕了,完全不符合我的期望。

顺便说一下,你不必使用glClear(),只是绘制一个全屏四边形似乎具有相同的效果(显然,纹理四边形更昂贵)。看起来你只需要使所有的瓷砖无效。