2010-03-29 242 views
10

Apple's Technical Q&A on addressing flickering (QA1650)包括以下段落。 (重点煤矿。)glClear()如何提高性能?

您必须提供颜色与屏幕上的每个像素。在绘制代码的开始处,最好使用glClear()来初始化颜色缓冲区。一个全屏幕清楚每个颜色,深度和模板缓冲的(如果你使用它们)在帧的开始也可以一般提高应用程序的性能。

在其他平台上,我一直发现它是对的优化而不是如果要绘制到每个像素,请清除颜色缓冲区。 (为什么要浪费时间填写,如果你只是要覆写清晰的彩色颜色缓冲区?)

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

+0

很多情况下,忽略清除颜色/深度/模板缓冲区的情况并非如此。正如我在其他答案中的一些评论中所解释的,它与现代GPU中的缓冲区压缩有关。就现代GPU而言,我在谈论Radeon 9xxx系列。清除这些缓冲区实际上是几乎所有GPU架构的性能提升。 – 2013-09-18 20:25:39

回答

15

这是最有可能与基于区块的渲染,从而将整个视口砖(小窗口,一般可以是32×32大小的),这些瓦片被保存在速度更快的记忆。这个较小的内存和真实的帧缓冲之间的复制操作可能需要一些时间(内存操作比算术操作慢得多)。通过发出glClear命令,你是在告诉你不需要先前的缓冲内容的硬件,因此并不需要复制的颜色/深度/无论从帧缓冲较小的区块存储。

+1

如果您需要更多详细信息,请查看这些参考文献: - http://developer.amd.com/gpu_assets/gdc2008_ribble_maurice_TileBasedGpus.pdf - http://www.beyond3d.com/content/articles/38/ – AdilYalcin 2010-03-29 20:34:03

+0

它是与颜色/深度/模板压缩有关。简而言之,通过适当的方式清除缓冲区将使每个tile(*这也适用于常规GPU,而不仅仅是像PowerVR *那样的基于Tile的延迟渲染)更容易压缩并提高吞吐量。这些缓冲区的压缩不是为了节省存储空间,而是为了减少必须传输的数据量。清除瓦片是在每个瓦片中设置几个比特的微不足道的事情,并且一旦完成,清除的瓦片从存储器获取非常便宜。 – 2013-09-18 20:16:14

-4

我可以肯定地确认您必须为屏幕上的每个像素提供颜色

我在建立在Xcode的iPhone OpenGL的模板裸露的骨头测试应用程序验证了这一点:

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

如果我离开了glClear线(或回路中移动它进一步下跌,一些其他的OpenGL后调用),线程(通过CADisplayLink运行)几乎不再有任何更新。看起来好像CPU/GPU同步失控并且线程被阻塞。 如果你问我很吓人,而且完全不符合我的期望。

顺便说一句,你不一定必须使用glClear(),只是绘制一个全屏四核似乎有相同的效果(显然,一个纹理四是更昂贵的)。看来你只需要使所有的瓦片无效。

+2

** - 1 **:您应该使用'glClear(...)',现代GPU使用颜色缓冲区,深度缓冲区和模板缓冲区压缩。清除缓冲区非常便宜,因为这些缓冲区通常是分层平铺的,并且清除缓冲区的过程相当于翻转每个区块中的一个或两个位。如果您经常清除缓冲区,它甚至可以帮助进行许多早期的片段测试和一般帧缓冲区吞吐量。在基于图块的延迟渲染GPU(例如PowerVR SGX - 所有iOS设备)上,出于类似的原因同样重要。 – 2013-09-18 19:59:00

3

随着在iOS 4,这晚于接受的答案官方评论长远角度看...

我认为,应该在与苹果公司的有关GL_EXT_discard_framebuffer扩展的意见,应该始终在使用一并阅读如果可能的话(甚至在其他地方)结束一帧。丢弃帧缓冲区时,将其内容置于未定义状态。那的好处是,当你下次结合一些其他的帧缓冲,从未有任何需要您的缓冲区的当前内容存储出去的地方,同样,当你下次恢复缓冲区没有必要对它们进行检索。这些都应该是GPU的内存拷贝,而且非常便宜,但它们远没有免费,iPhone的共享内存架构可能意味着更复杂的考虑可能会出现。

基于iOS上的合成模型,这是合理的假设,即使你的应用程序不绑定,并在其范围内取消绑定帧缓冲区,GPU具有做这些任务隐含至少一次为每个帧。

我敢想,司机是足够聪明的,如果你做的第一件事情是清楚的,你会得到放弃扩展的好处的一半,而没有实际使用它。

-2

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

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

+0

这与OP的问题无关... – RecursiveExceptionException 2016-09-11 17:43:14