为什么设置了view的Opaque性能会提高(GPU)

原创 2016年06月01日 14:40:47
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.
版权声明:本文为博主原创文章,未经博主允许不得转载。

UIView的alpha、hidden和opaque属性之间的关系和区别

opaque 该属性为BOOL值,UIView的默认值是YES,但UIButton等子类的默认值都是NO。opaque表示当前UIView是否不透明,不过搞笑的是事实上它却决定不了当前UIView是不...

将View设置为Opaque

转自:http://www.tiboo.cn/dianzijie/b1837169/ This property provides a hint to the drawing system ...

iOS开发之opaque、alpha

alpha:CGFloat alpha;属性值是浮点型数字,取值范围是0.0到1.0,0.0代表完全透明,而1.0代表完全不透明。如果父视图的透明度设置为N(0.0...

ios开发之View属性hidden, opaque, alpha, opacity的区别

发表于2016/5/6 11:52:47  472人阅读 分类: iOS 一、alpha 液晶显示器是由一个个的像素点组成的,每个像素点都可以显示一个由RGBA颜色空间组成的一种色值。其中的A...

UIView的alpha、hidden和opaque属性之间的关系和区别

转自出处:http://blog.csdn.net/wzzvictory/article/details/10076323

UIView中hidden、alpha、clear color与opaque的区别

转载自:传人的技术博客 《UIView中hidden、alpha、clear color与opaque的区别》 http://joeshang.github.io/2014/12/19/trans...

86/88汇编代码的运行调试

86/88汇编是windows系统的语言基础之一,本文就是在32位window操作系统下通过dos系统运行86/88汇编代码。我在上大学是为了计算机三级pc上机试题的运行发愁,我终于从微机原理上机实践...

美联(蘑菇街)无线技术分享感想

美联客户端无线网关实践 网关的第一个优化的问题: 由于https(需要5次握手)比http(需要3次握手)多了两次握手(建立ssl隧道),所以在弱网环境下,https建立失败的几率会比http请求...

为什么设置了view的Opaque性能会提高(GPU)

转自:http://blog.csdn.net/u011452278/article/details/51555806 Opaque该属性为BOOL值,UIView的默认值是YES,但U...

Android GPU加速渲染自定义View 性能改善<13>

常常在开发过程中使用自定义的View,而自定义的View的图形往往是onDraw里面实现的,这样就可能因为在父容器里面而因为父容器稍微的变更,就会重绘,重绘是需要很多内存消耗的,而且如果父容器有背景色...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么设置了view的Opaque性能会提高(GPU)
举报原因:
原因补充:

(最多只允许输入30个字)