我刚在该网站上发现了一些东西:iphoneexamples.com。 展望“显示图像”我发现了一些新的东西给我。使用“不透明”属性的图像具有更好的性能?为什么?
myImage.opaque = YES; //明确表示不透明
请问有人可以向我解释一下吗?哪种(或用例)的图像起作用?什么时候不? 会很高兴知道。感谢您的时间...
我刚在该网站上发现了一些东西:iphoneexamples.com。 展望“显示图像”我发现了一些新的东西给我。使用“不透明”属性的图像具有更好的性能?为什么?
myImage.opaque = YES; //明确表示不透明
请问有人可以向我解释一下吗?哪种(或用例)的图像起作用?什么时候不? 会很高兴知道。感谢您的时间...
iPhone GPU是基于图块的渲染器。如果覆盖图层在整个图块上完全不透明,那么除了不必对该图块中的像素进行合成之外,GPU可以忽略设置和处理与该图块下面的图层相关的任何图形命令。
如果您的图片没有覆盖完整的图块,GPU仍然必须处理多个图层。瓦片的大小取决于实施情况,但微小的图形图像不太可能覆盖瓦片。覆盖多个瓷砖的巨大图像将显示从不透明的最大优势。
当视图或图层不透明时,您会获得比不透明时更好的性能。如果它不透明,图形系统必须将该图层与下面的图层进行合成以生成最终图像。如果它是不透明的,那么它只是将像素复制到帧缓冲区。
从View Programming Guide for iOS:
声明视图作为不透明每当 可能
UIKit中使用不透明 属性的每一视图的确定 视图是否可以优化 合成操作。将此属性的 值设置为YES, 自定义视图会告诉UIKit,它确实不需要为您的视图呈现 后面的任何内容。较少的渲染可能会导致 代码的性能提高 ,并且通常会受到鼓励。 当然,如果将不透明属性 设置为YES,那么您的视图必须完全填充其边界矩形,并使用完全不透明的内容填充 。
hotpaw2指出了背后的幕后原因,可在OpenGL ES Programming Guide for iOS发现:
推迟 呈现的另一个优点是,它允许GPU来 执行隐面在处理 片段之前删除。 不可见的像素会被丢弃,而不会被 抽样纹理或执行 碎片处理,显着减少GPU 必须执行的计算以呈现图块。为了 理解本 功能最大的好处,用不透明的内容能够吸引尽可能多的帧 的可能和 尽量少用勾兑的,阿尔法 测试,并在GLSL着色器的丢弃指示 。由于硬件 执行隐藏表面删除,因此您的应用程序不需要 ,从012到从前到后排序原语。
有一点棘手的问题需要注意的是,UIImageView将在任何时候将图像属性更改为新的UIImage时将opaque属性重置为FALSE。您可以明确地检查代码并在对image属性进行任何更改后设置opaque属性,或者可以扩展UIImageView并为您提供自己的setImage实现,它在调用super setImage方法后设置为不透明。我只是偶然发现了这件事。
有意思......那么你如何处理表现并将不透明设置为YES?在更改图像后立即重新设置? – 2014-10-14 22:44:17
是的,它必须在图像属性更改后重置。性能获胜发生在OS运行的视图组合逻辑内部。如果没有设置财产,那么设置财产对性能问题的影响并不大,而在构图过程中需要额外的工作。 – MoDJ 2014-10-16 06:04:48