使用具有“不透明”属性的图像可以提高性能?为什么?

时间:2011-03-27 19:02:12

标签: iphone cocoa-touch performance ios uiimageview

我刚刚在该网站上找到了一些内容:iphoneexamples.com。 期待“显示图像”,我发现了一些新的东西。

myImage.opaque = YES; //明确表示不透明

有人可以向我解释一下吗?对于哪种(或用例)图像,它有效吗?什么时候不? 很高兴知道。谢谢你的时间......

4 个答案:

答案 0 :(得分:13)

iPhone GPU是基于图块的渲染器。如果覆盖层在整个图块上完全不透明,则GPU可以忽略设置和处理与该特定图块下面的图层相关的任何图形命令,此外还不必对该图块中的像素进行合成。

如果您的图片未覆盖整个图块,则GPU仍可能需要处理多个图层。图块的大小取决于实现,但微小的图形图像不太可能覆盖图块。覆盖多个图块的巨大图像将显示出不透明的最大优势。

答案 1 :(得分:9)

来自View Programming Guide for iOS

  

无论何时将视图声明为不透明   可能

     

UIKit使用不透明   每个视图的属性来确定   视图是否可以优化   合成操作。设置   对于a,此属性的值为YES   自定义视图告诉UIKit它确实如此   不需要渲染任何内容   你的看法。较少的渲染可以导致   提高了绘图的性能   代码,通常是鼓励的。的   当然,如果你设置了opaque属性   是的,你的观点必须填补它   完全限制矩形   不透明的内容。

hotpaw2指出了幕后的原因,可以在OpenGL ES Programming Guide for iOS中找到:

  

推迟的另一个优点   渲染是它允许GPU   之前执行隐藏表面移除   片段被处理。像素那个   如果没有可见则被丢弃   采样纹理或执行   片段处理,显着   减少了GPU的计算量   必须执行以呈现图块。至   从中获益最多   功能,绘制尽可能多的框架   尽可能使用不透明的内容   尽量减少使用混合,alpha   测试和丢弃指令   在GLSL着色器中。因为硬件   执行隐藏表面删除,它是   你的申请没有必要   从前到后排序原语。

答案 2 :(得分:3)

当视图或图层不透明时,您会获得更好的性能。如果它不是不透明的,则图形系统必须将该层与下面的层合成以产生最终图像。如果它是不透明的,那么只需将像素复制到帧缓冲区即可。

答案 3 :(得分:1)

需要注意的一个小问题是,只要将image属性更改为新的UIImage,UIImageView就会将opaque属性重置为FALSE。您可以在对image属性进行任何更改后显式检入代码并设置opaque属性,或者可以扩展UIImageView并提供自己的setImage实现,该setImage在调用super setImage方法后设置opaque。我偶然发现了这件事。