CALayer属性及优化
2017-03-08 本文已影响132人
从容到没边的优雅
iOS性能优化中的离屏渲染
场景:当使用圆角,阴影,遮罩的时候
为什么离屏渲染会造成性能消耗:
屏幕外渲染并不意味着软件绘制,但是它意味着图层必须在被显示之前在一个屏幕外上下文中被渲染(不论CPU还是GPU)。
所以当使用离屏渲染的时候会很容易造成性能消耗,因为在OPENGL里离屏渲染会单独在内存中创建一个屏幕外缓冲区并进行渲染,而屏幕外缓冲区跟当前屏幕缓冲区上下文切换是很耗性能的。
使用Instruments来监测离屏渲染
Instruments的Core Animation工具中有几个和离屏渲染相关的检查选项:
-
Color Offscreen-Rendered Yellow
开启后会把那些需要离屏渲染的图层高亮成黄色,这就意味着黄色图层可能存在性能问题。 -
Color Hits Green and Misses Red
如果shouldRasterize
被设置成YES,对应的渲染结果会被缓存,如果图层是绿色,就表示这些缓存被复用;如果是红色就表示缓存会被重复创建,这就表示该处存在性能问题了。
iOS版本上的优化
- iOS 9.0 之前UIimageView跟UIButton设置圆角都会触发离屏渲染。
- iOS 9.0 之后UIButton设置圆角会触发离屏渲染,而UIImageView里png图片设置圆角不会触发离屏渲染了,如果设置其他阴影效果之类的还是会触发离屏渲染的。
CALayer的shouldRasterize
属性
/*
* 当shouldRasterize设成true时,layer被渲染成一个bitmap,并缓存起来,等下次使用时不会再重新去渲染了。实现圆角本身就是在做颜色混合(blending),如果每次页面出来时都blending,消耗太大,这时shouldRasterize = yes,下次就只是简单的从渲染引擎的cache里读取那张bitmap,节约系统资源。
*/
@property BOOL shouldRasterize;
/* The scale at which the layer will be rasterized (when the
* shouldRasterize property has been set to YES) relative to the
* coordinate space of the layer. Defaults to one. Animatable. */
@property CGFloat rasterizationScale;
// 栅格化 - 提高性能
// 设置栅格化后,图层会被渲染成图片,并且缓存,再次使用时,不会重新渲染
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
self.layer.shouldRasterize = YES; ```
####参考:
* [iOS性能优化中的离屏渲染](http://www.cnblogs.com/somethingWithiOS/p/5724271.html) [博客地址](http://blog.csdn.net/zhuangyou123/article/details/8737367)
****
****
###CALayer的anchorPoint属性
####需求场景:
* 经常会遇到需求,要求手势的缩放或者旋转操作,要求动作变化围绕某一个特定点,或者是两指的中心点,或者是某一个点。
* 转场动画特效
####参考:
* 这篇博客讲的很细致,Thanks![博客地址](http://www.cnblogs.com/benbenzhu/p/3615516.html?utm_source=tuicool&utm_medium=referral)
####下面是我的提取的,适合自己看
* position 和 anchorPoint
每一个UIView内部都默认关联着一个CALayer, UIView有frame、bounds和center三个属性,CALayer也有类似的属性,分别为frame、bounds、position、anchorPoint。
* * anchorPoint : 值域(0-1)
举例:一张A4纸,用一个钉子订住,纸可以围着这个钉子转动,anchorPoint就类似于这里的钉子。钉的位置不同旋转的形态自然不同,,, 在iOS中,anchorPoint点的值是用一种相对bounds的比例值来确定的,在A4纸的左上角、右下角anchorPoint分别为(0, 0), (1, 1) ,类似地,可以得出在白纸的中心点、左下角和右上角的anchorPoint为(0.5,0.5), (0,1), (1,0)。
* 像UIView有superView与subView的概念一样,CALayer也有superLayer与layer的概念
* position:“The layer’s position in its superlayer’s coordinate space.” ,相当于A4纸在桌子上的位置,桌子就是这里的superLayer。
position 是layer中的anchorPoint在superLayer中的位置坐标,因此可以说,position是相对superLayer的,anchorPoint是相对layer的。
position、frame、anchorPoint之间有个计算关系
position.x = frame.origin.x + anchorPoint.x * bounds.size.width;
position.y = frame.origin.y + anchorPoint.y * bounds.size.height;```