使用具有“不透明”属性的图像获得更好的性能?为啥?
Posted
技术标签:
【中文标题】使用具有“不透明”属性的图像获得更好的性能?为啥?【英文标题】:Better performance using images with "opaque" property? Why?使用具有“不透明”属性的图像获得更好的性能?为什么? 【发布时间】:2011-03-27 19:02:12 【问题描述】:我刚刚在那个网站上找到了一些东西:iphoneexamples.com。 寻找“显示图像”我发现了一些新东西。
myImage.opaque = YES; // 为了性能而显式不透明
谁能给我解释一下,好吗?它适用于哪种(或用例)图像?什么时候不? 很高兴知道。谢谢你的时间......
【问题讨论】:
【参考方案1】:iPhone GPU 是基于图块的渲染器。如果覆盖层在整个图块上完全不透明,则 GPU 可以忽略设置和处理与该特定图块下面的图层相关的任何图形命令,而不必合成该图块中的像素。
如果您的图像没有覆盖完整的图块,GPU 仍可能需要处理多个图层。瓦片的大小取决于实现,但微小的图形图像覆盖瓦片的可能性要小得多。覆盖多个图块的巨大图像将显示不透明的最大优势。
【讨论】:
【参考方案2】:来自View Programming Guide for ios:
无论何时都将视图声明为不透明 可能
UIKit 使用不透明 每个视图的属性来确定 视图是否可以优化 合成操作。设置 此属性的值为 YES 自定义视图告诉 UIKit 它确实 后面不需要渲染任何内容 你的看法。较少的渲染会导致 提高绘图性能 代码并且通常被鼓励。的 当然,如果你设置 opaque 属性 是,您的视图必须填充其 完全用完全边界矩形 不透明的内容。
hotpaw2指出了这个的幕后原因,可以在OpenGL ES Programming Guide for iOS找到:
延迟的另一个优点 渲染是它允许GPU 之前执行隐藏表面移除 片段被处理。像素 不可见被丢弃 采样纹理或执行 片段处理,显着 减少 GPU 的计算量 必须执行才能渲染图块。到 从中获得最大的利益 功能,绘制尽可能多的框架 尽可能包含不透明的内容,并且 尽量减少混合的使用,阿尔法 测试和丢弃指令 在 GLSL 着色器中。因为硬件 执行隐藏表面去除,它是 您的申请不需要 从前到后对基元进行排序。
【讨论】:
【参考方案3】:当视图或图层不透明时,您会获得比不透明时更好的性能。如果它不是不透明的,则图形系统必须将该层与下面的层合成以生成最终图像。如果它是不透明的,那么只需将像素复制到帧缓冲区即可。
【讨论】:
【参考方案4】:需要注意的一个小问题是,只要图像属性更改为新的 UIImage,UIImageView 就会将 opaque 属性重置为 FALSE。您可以在对图像属性进行任何更改后显式签入代码并设置 opaque 属性,或者您可以扩展 UIImageView 并为您提供自己的 setImage 实现,该实现在调用超级 setImage 方法后设置 opaque。我只是偶然发现了这一点。
【讨论】:
有趣...那么您如何处理性能并将 opaque 设置为 YES 呢?更改图像后立即重新设置? 是的,更改图像属性后必须重新设置。性能提升发生在操作系统运行的视图组合逻辑中。与如果未设置属性在合成过程中所需的额外工作相比,设置该属性并不是一个性能问题。以上是关于使用具有“不透明”属性的图像获得更好的性能?为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在开发控制台启动时我在 Chrome 中获得更好的性能?