我刚刚在该网站上找到了一些内容:iphoneexamples.com。 期待“显示图像”,我发现了一些新的东西。
myImage.opaque = YES; //明确表示不透明
有人可以向我解释一下吗?对于哪种(或用例)图像,它有效吗?什么时候不? 很高兴知道。谢谢你的时间......
答案 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。我偶然发现了这件事。