代码之家  ›  专栏  ›  技术社区  ›  Jon-Eric

glclear()如何提高性能?

  •  10
  • Jon-Eric  · 技术社区  · 14 年前

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

    必须为屏幕上的每个像素提供颜色。在绘图代码的开头,最好使用glclear()初始化颜色缓冲区。在一帧开始时,全屏显示每个颜色、深度和模板缓冲区(如果正在使用它们),通常也可以 改善 应用程序的性能。

    在其他平台上,我一直认为这是对 如果要绘制到每个像素,请清除颜色缓冲区。(如果你只想覆盖这个清晰的颜色,为什么还要浪费时间填充颜色缓冲区?)

    调用glclear()如何提高性能?

    4 回复  |  直到 10 年前
        1
  •  15
  •   AdilYalcin    14 年前

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

        2
  •  3
  •   Tommy    13 年前

    从长远来看,官方对iOS 4的评论会公布接受的答案…

    我认为这应该和苹果公司关于 GL_EXT_discard_framebuffer 扩展,如果可能的话,它应该总是用在帧的末尾(实际上在其他地方)。丢弃帧缓冲区时,会将其内容置于未定义状态。这样做的好处是,当您下一次绑定其他帧缓冲区时,不需要将缓冲区的当前内容存储到某个地方,同样,当您下一次恢复缓冲区时,也不需要检索它们。这些都应该是GPU内存拷贝,而且非常便宜,但是它们离免费还很远,而且iPhone的共享内存架构可能意味着会突然出现更复杂的考虑。

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

    我敢猜测,如果你做的第一件事是清楚的,你就可以得到一半的好处,放弃扩展,而不实际使用它。

        3
  •  -2
  •   Gusdor    12 年前

    尝试在传递给chooseconfig的glsurface属性中减小framebuffer的大小。

    例如,至少将属性设置为0,或者完全忽略它们以使用默认值,除非您有特定的需求。

        4
  •  -4
  •   Chris Frederick    13 年前

    我可以肯定你必须 为屏幕上的每个像素提供颜色 .

    我已经在Xcode的iPhone OpenGL模板上构建的一个裸骨测试应用程序中验证了这一点:

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

    如果我把 glClear 行(或者在其他OpenGL调用之后在循环中将其进一步向下移动),线程(通过 CADisplayLink )很难再得到任何更新。似乎CPU/GPU同步出了问题,线程被阻塞了。 如果你问我,我会觉得很可怕,完全不符合我的期望。

    顺便说一句,您不必使用glclear(),只需绘制一个全屏四边形似乎具有相同的效果(显然,一个 织构的 Quad更贵)。看来你只需要使所有的瓷砖失效就行了。