美文网首页
CALayer属性及优化

CALayer属性及优化

作者: 从容到没边的优雅 | 来源:发表于2017-03-08 13:47 被阅读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;```

    相关文章

      网友评论

          本文标题:CALayer属性及优化

          本文链接:https://www.haomeiwen.com/subject/pmgxmttx.html