首选说一下 opaque 这个属性, 是 不透明的意思, BOOL值,设置为 YES 表示 view不透明,设置为 NO 表示表示 view 透明,
所有的 view 都有这个属性,但是 UIView 默认为 YES, UIButton 等默认为 NO,
为什么说这个属性能提高性能呢?
Apple 文档的说明是:
opaque 这个属性给 渲染系统 提供了如何处理 views 的提示,如果 opaque 设置为YES, 渲染系统就会认为这个 view 是完全不透明的,这就使得 渲染系统 优化一些内容和提高性能,如果设置为 NO,渲染系统 正常的和其他内容组成这个 view,
相对于简单和静止的画面中,设置这个属性的影响不会太大,但是如果 view 在 scrollview 中或者 view 在一段动画中,不设置这个属性的话就会在很大程度上影响 app的性能.
其实说白了就一句话,如果 view 设置成不透明的,就会单独显示这个 view,如果 设置成 透明的, 就会和其他的 view 一起混合来显示 这个 view,所以说就会消耗 GPU 来计算,消耗性能
但是有时候我们将 view 的 opaque 设置为 NO,按理说这时候 view就会变为透明了,结果是该 view 照样是可见的,
有红色view(在上) 和 绿色View(在下),他们两个有重叠,当我们设置红色view的 opaque为 NO时,按理说就会显示出整个的 绿色View,但结果不是这样,为什么呢?
我们都知道 显示器是由像素点组成的,任何一个像素点都是由 RGBA组成的, A就是 alpha值,透明度,对于没有交叉的部分,只需要简单的显示红色或绿色就可以,但是对于重叠的部分,GPU会进行图层混合计算,计算公式为:
R = S + D(1 - Sa)
其中,R表示混合结果的颜色,S是源颜色(位于上层的红色图层一),D是目标颜色(位于下层的绿色图层二),Sa是源颜色的alpha值,即透明度。公式中所有的S和D颜色都假定已经预先乘以了他们的透明度。
知道图层混合的基本原理以后,再回到正题说说opaque属性的作用。当UIView的opaque属性被设为YES以后,按照上面的公式,也就是Sa的值为1,这个时候公式就变成了:
R = S
即不管D为什么,结果都一样。因此GPU将不会做任何的计算合成,不需要考虑它下方的任何东西(因为都被它遮挡住了),而是简单从这个层拷贝。这节省了GPU相当大的工作量。由此看来,opaque属性的真实用处是给绘图系统提供一个性能优化开关!
总的来说, opaque 决定不了当前 view 是不是透明,是否透明跟 alpha 和 hidden 有关
但是其作用在于:
给绘图系统提供一个性能优化的开关,
如果设置为 YES,绘图系统把这个视图当做一个不透明的来对待,这样就会提高性能,
如果设置为 NO,绘图系统就会把它和其他的普通view一样来对待,不去做优化操作.
所以说应该把 view 的 opaque 设置为 YES.