首页 > 代码库 > 绘制阴影引发的 iOS 绘图性能问题总结

绘制阴影引发的 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 选项将高亮进行离屏渲染的区域。

技术分享

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

技术分享

 
 

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