iOS应用性能调优之尽量使Views不透明
若是你有不透明的Views,你应该设置它们的opaque属性为YES。html
缘由是这会使系统用一个最优的方式渲染这些views。这个简单的属性在IB或者代码里均可以设定。ios
Apple的文档对于为图片设置不透明属性的描述是:性能优化

(opaque)这个属性给渲染系统提供了一个如何处理这个view的提示。若是设为YES, 渲染系统就认为这个view是彻底不透明的,这使得渲染系统优化一些渲染过程和提升性能。若是设置为NO,渲染系统正常地和其它内容组成这个View。默认值是YES。微信
在相对比较静止的画面中,设置这个属性不会有太大影响。然而当这个view嵌在scroll view里边,或者是一个复杂动画的一部分,不设置这个属性的话会在很大程度上影响app的性能。app
你能够在模拟器中用Debug\Color Blended Layers选项来发现哪些view没有被设置为opaque。目标就是,能设为opaque的就全设为opaque!iview
UIView的alpha、hidden和opaque属性之间的关系和区别
转载请注明出处
若是以为文章对你有所帮助,请经过留言或关注微信公众账号wangzzstrive来支持我,谢谢!
1、alpha
液晶显示器是由一个个的像素点组成的,每一个像素点均可以显示一个由RGBA颜色空间组成的一种色值。其中的A就表示透明度alpha,UIView中alpha是一个浮点值,取值范围0~1.0,表示从彻底透明到彻底不透明。
当把alpha的值设置成0之后:
一、当前的UIView和subview都会被隐藏,而无论subview的alpha值为多少。
二、当前UIView会从响应者链中移除,而响应者链中的下一个会成为第一响应者
alpha的默认值是1.0。
另外,更改alpha值时,默认是有动画效果的,这是由于图层在Cocoa中是由Core Animation中CALayer表示的,该动画效果是CALayer的隐含动画。固然也有办法禁用此动画效果,在这就很少述了,感兴趣的同窗能够继续关注后续的博客。
2、hidden
该属性为BOOL值,用来表示UIView是否隐藏,默认值是NO。
当值设为YES时:
一、当前的UIView和subview都会被隐藏,而无论subview的hidden值为多少。
二、当前UIView会从响应者链中移除,而响应者链中的下一个会成为第一响应者
总之,同alpha为0时的显示效果相同。具体二者之间有什么区别就不清楚了,若是有知道的还望不吝赐教!
3、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 = Sui
即无论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.
你们切记!!!!
4、最后
当把UIView的alpha属性设成0,或者把hidden设成YES的时候,当前UIView和它所包含的子UIView都会变成不可见,同时也不会再响应event事件。注意这里是或的关系,即只要设置了其中的一个都会有此效果,而无论另一个属性的值是什么。