view 的 opaque 属性

首选说一下 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 照样是可见的。

1.例子1:

有红色view(在上) 和 绿色View(在下),他们两个有重叠,当我们设置红色view的 opaque为 NO时,按理说就会显示出整个的 绿色View,但结果不是这样,为什么呢?
我们都知道 显示器是由像素点组成的,任何一个像素点都是由 RGBA组成的, A就是 alpha值,透明度,对于没有交叉的部分,只需要简单的显示红色或绿色就可以,但是对于重叠的部分,GPU会进行图层混合计算,计算公式为:

R = S + D(1 - Sa)

结果颜色=源颜色+目标颜色(1-源颜色alpha值)*

其中,R表示混合结果的颜色,S是源颜色(位于上层的红色图层一),D是目标颜色(位于下层的绿色图层二),Sa是源颜色的alpha值,即透明度。公式中所有的S和D颜色都假定已经预先乘以了他们的透明度。
知道图层混合的基本原理以后,再回到正题说说opaque属性的作用。当UIView的opaque属性被设为YES以后,按照上面的公式,也就是Sa的值为1,这个时候公式就变成了:
R = S
即不管D为什么,结果都一样。因此GPU将不会做任何的计算合成,不需要考虑它下方的任何东西(因为都被它遮挡住了),而是简单从这个层拷贝。这节省了GPU相当大的工作量。由此看来,opaque属性的真实用处是给绘图系统提供一个性能优化开关!
当我们把红色view alpha 变为0.5时,就会变成混合颜色。

2.示例2

总的来说, opaque 决定不了当前 view 是不是透明,是否透明跟 alpha 和 hidden 有关
但是其作用在于:
给绘图系统提供一个性能优化的开关,
如果设置为 YES,绘图系统把这个视图当做一个不透明的来对待,这样就会提高性能,
如果设置为 NO,绘图系统就会把它和其他的普通view一样来对待,不去做优化操作.
所以说应该把 view 的 opaque 设置为 YES.

上一篇:redis07


下一篇:【笔记记录】2020-04-30