Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone glClear()如何提高性能?_Iphone_Opengl Es - Fatal编程技术网

Iphone glClear()如何提高性能?

Iphone glClear()如何提高性能?,iphone,opengl-es,Iphone,Opengl Es,包括以下段落。(我的重点。) 必须为屏幕上的每个像素提供颜色。在绘图代码的开头,最好使用glClear()初始化颜色缓冲区。在一帧开始时,全屏清除每个颜色、深度和模具缓冲区(如果您正在使用它们),通常也可以提高应用程序的性能 在其他平台上,我总是发现如果要绘制每个像素,则不清除颜色缓冲区是一种优化。(如果要覆盖清晰的颜色,为什么要浪费时间填充颜色缓冲区?) 调用glClear()如何提高性能?这很可能与基于平铺的渲染有关,它将整个视口划分为平铺(较小的窗口,通常大小为32x32),这些平铺保存在

包括以下段落。(我的重点。)

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

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


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

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

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

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

[context presentRenderbuffer:GL_RENDERBUFFER];  
glClear( GL_COLOR_BUFFER_BIT );
如果我省略了
glClear
行(或者在一些其他OpenGL调用之后,在循环中进一步向下移动它),线程(通过
CADisplayLink
运行)将很难再获得任何更新。似乎CPU/GPU同步失控,线程被阻塞。 如果你问我的话,这是非常可怕的事情,完全不符合我的期望


顺便说一句,您不必使用glClear(),只需绘制一个全屏四边形似乎也有相同的效果(显然,纹理四边形更昂贵)。看来你只需要让所有的磁贴失效。

从iOS 4官方评论的长远角度来看,它会将被接受的答案延迟

我认为应该结合苹果对
GL\u EXT\u discard\u framebuffer
扩展的评论来阅读这篇文章,如果可能的话,它应该总是用在帧的末尾(甚至其他地方)。丢弃帧缓冲区时,会将其内容置于未定义状态。这样做的好处是,下次绑定其他帧缓冲区时,不需要将缓冲区的当前内容存储到某个位置,同样,下次恢复缓冲区时也不需要检索它们。这些都应该是GPU内存拷贝,因此非常便宜,但它们远不是免费的,iPhone的共享内存架构可能意味着可能会出现更复杂的问题

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


我敢猜测,驱动程序足够聪明,如果你做的第一件事是明确的,你就可以在不实际使用它的情况下获得放弃扩展的一半好处。

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


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

如果需要更多详细信息,请查看这些参考:-它也与颜色/深度/模具压缩相关。简而言之,通过适当的方法清除缓冲区将使每个分片(这也适用于常规GPU,而不仅仅是基于分片的延迟渲染,如PowerVR中的那些)更容易压缩并提高吞吐量。压缩这些缓冲区不是为了节省存储空间,而是为了减少必须传输的数据量。清除磁贴是在每个磁贴中设置一些位的一件小事,一旦完成,清除的磁贴从内存中获取非常便宜。-1:您应该使用
glClear(…)
,现代GPU使用颜色缓冲、深度缓冲和模具缓冲压缩。清除缓冲区非常便宜,因为这些缓冲区通常是分层平铺的,清除缓冲区的过程相当于翻转每个平铺中的一个或两个位。如果定期清除缓冲区,它甚至有助于许多早期片段测试和一般帧缓冲区吞吐量。在基于分片的延迟渲染GPU(例如PowerVR SGX-所有iOS设备)上,出于类似原因,这一点同样重要。多年来,忽略清除颜色/深度/模具缓冲区并不是一种性能优化。正如我在其他答案的一些评论中所解释的,它与现代GPU中的缓冲区压缩有关。通过现代GPU,我所说的可以追溯到Radeon 9xxx系列。清除这些缓冲区实际上是几乎所有GPU体系结构的性能提升。