使用具有“不透明”属性的图像获得更好的性能?为啥?

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 中获得更好的性能?

在WPF中使用另一个控件作为不透明蒙板?

在 WPF 中使用另一个控件作为不透明蒙版?

我是不是需要在代码而不是 IB 中调整下载图像的大小以获得更好的性能?

合并两个图像

如何使用 CSS3 更改具有不透明度过渡的图像以响应 onClick 事件?