zoukankan      html  css  js  c++  java
  • 绘制阴影引发的 iOS 绘图性能问题总结

    转自:http://blog.devdlh.com/blog/2013/03/18/performance-problerm-caused-by-shadowpath/

    绘制阴影引发的 iOS 绘图性能问题总结

    MAR 18TH, 2013 | COMMENTS

    在 iOS 开发中,通过设置 layer 的 shadowColor、shadowOpacity、shadowOffset、shadowRadius 几个属性可以很方便的为 UIView 添加阴影效果。但是前段时间碰到一个问题,在添加了阴影后,会出现动画卡顿的现象。在一番 Google 以后找到了解决方案,需要为阴影指定路径,即设置 layer 的 shadowPath 属性。例如:

    1
    
    view.layer.shadowPath = [UIBezierPath  bezierPathWithRect:view.bounds].CGPath;

    不指定阴影路径时,绘制阴影会产生大量的 Offscreen-Rendered 。而 Offscreen-Rendered(离屏渲染)和 Blending(混合)是 iOS 绘图中对性能影响比较大的两方面。

    Offscreen-Rendered

    离屏渲染意味着某一区域每帧渲染了两次。大部分离屏幕渲染由阴影和遮障绘制造成。以阴影绘制为例例,iOS 会先绘制目标的阴影,然后绘制目标本身。当我们没有设置阴影的路径时,iOS 在每次绘制前会递归每个子层来计算阴影的精确路径,这是非常消耗性能的,也导致了动画时出现卡顿。

    因此,一般情况下需要指定阴影的路径。当 View 的 bound 改变时,重新设置阴影路径。如果 View 的 bound 做动画,则需要使用 CAAnimation 为 shadowPath 设置动画。

    参考文档

    Blending

    iOS 在渲染每一帧时,都将计算每一个像素点的颜色。当最上面的层不透明时,只需取最上面的层的颜色。而当上面的层存在透明度时,需要混合每一层的颜色来计算得到最终显示的颜色。自上而下有透明度的层越多,计算量越大,这也会导致动画时性能降低。因此,我们在开发中,要尽量减少不必要的透明层。

    使用 Instruments 检测绘图性能

    使用 Instruments 的 Core Animation 模板可以很方便的检测应用中的 Blending 和 Offscreen-Rendered 。

    勾选 Color Offscreen-Rendered Yellow 选项将高亮进行离屏渲染的区域。

    Offscreen-Rendered 截图

    勾选 Color Blended Layers 将显示进行图层混合的区域,颜色越深表示计算量越大。

    Blended Layers 截图

     
     
  • 相关阅读:
    Oracle普通表->分区表转换(9亿数据量)
    RHEL6.4 + Oracle 11g DG测试环境快速搭建参考
    java 获取时间戳的三种方式
    java sm3加密算法
    java byte数组与String互转
    Java的多线程
    最大重叠点
    23. 客户默认选项(Default Customer Options)
    Android Studio 1.3RC版 build加速
    查看linux机器是32位还是64位的方法
  • 原文地址:https://www.cnblogs.com/iOSJason/p/6126140.html
Copyright © 2011-2022 走看看