2011-03-27 34 views

回答

13

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

如果您的图片没有覆盖完整的图块,GPU仍然必须处理多个图层。瓦片的大小取决于实施情况,但微小的图形图像不太可能覆盖瓦片。覆盖多个瓷砖的巨大图像将显示从不透明的最大优势。

3

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

9

View Programming Guide for iOS

声明视图作为不透明每当 可能

UIKit中使用不透明 属性的每一视图的确定 视图是否可以优化 合成操作。将此属性的 值设置为YES, 自定义视图会告诉UIKit,它确实不需要为您的视图呈现 后面的任何内容。较少的渲染可能会导致 代码的性能提高 ,并且通常会受到鼓励。 当然,如果将不透明属性 设置为YES,那么您的视图必须完全填充其边界矩形,并使用完全不透明的内容填充 。

hotpaw2指出了背后的幕后原因,可在OpenGL ES Programming Guide for iOS发现:

推迟 呈现的另一个优点是,它允许GPU来 执行隐面在处理 片段之前删除。 不可见的像素会被丢弃,而不会被 抽样纹理或执行 碎片处理,显着减少GPU 必须执行的计算以呈现图块。为了 理解本 功能最大的好处,用不透明的内容能够吸引尽可能多的帧 的可能和 尽量少用勾兑的,阿尔法 测试,并在GLSL着色器的丢弃指示 。由于硬件 执行隐藏表面删除,因此您的应用程序不需要 ,从012到从前到后排序原语。

0

有一点棘手的问题需要注意的是,UIImageView将在任何时候将图像属性更改为新的UIImage时将opaque属性重置为FALSE。您可以明确地检查代码并在对image属性进行任何更改后设置opaque属性,或者可以扩展UIImageView并为您提供自己的setImage实现,它在调用super setImage方法后设置为不透明。我只是偶然发现了这件事。

+0

有意思......那么你如何处理表现并将不透明设置为YES?在更改图像后立即重新设置? – 2014-10-14 22:44:17

+0

是的,它必须在图像属性更改后重置。性能获胜发生在OS运行的视图组合逻辑内部。如果没有设置财产,那么设置财产对性能问题的影响并不大,而在构图过程中需要额外的工作。 – MoDJ 2014-10-16 06:04:48

相关问题