前言
我们一直都说设置 view
的 Opaque
属性值为 YES
,可以提高 GPU
的性能,达到优化代码目的,为什么呢?
注:图形处理器(英语:Graphics Processing Unit
,缩写:GPU
),又称显示核心、视觉处理器、显示芯片。
详解
Opaque
该属性为 BOOL
值, UIView
的默认值是 YES
,但 UIButton
等子类的默认值都是 NO
。 opaque
表示当前 UIView
是否不透明,不过搞笑的是事实上它却决定不了当前 UIView
是不是不透明,比如你将 opaque
设为 NO
,该 UIView
照样是可见的(上文说过,是否可见是由 alpha
或 hidden
属性决定的),照理说为 NO
就表示透明,那就应该是不可见的呀?
显示器中的每个像素点都可以显示一个由 RGBA
颜色空间组成的色值,比如上图中有红色和绿色两个图层色块,对于没有交叉的部分,即纯红色和绿色部分来说,对应位置的像素点只需要简单的显示红或绿,对应的 RGBA
为 (1,0,0,1)
和 (0,1,0,1)
就行了,负责图形显示的 GPU
需要很小的计算量就可以确定像素点对应的显示内容。
问题是红色和绿色还有相交的一块,其相交的颜色为黄色。这里的黄色是怎么来的呢?原来, 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
属性被设为 YES
时, GPU
就不会再利用图层颜色合成公式去合成真正的色值。因此,如果 opaque
被设置成 YES
,而对应 UIView
的 alpha
属性不为 1.0
的时候,就会有不可预料的情况发生,这一点苹果在官方文档中有明确的说明:
An opaque view is expected to fill its bounds with entirely opaque content—that is, the content should have an alpha value of 1.0. If the view is opaque and either does not fill its bounds or contains wholly or partially transparent content,the results are unpredictable. You should always set the value of this property to NO if the view is fully or partially transparent.
Author
如果你有什么建议,可以关注我,直接留言,留言必回。