Skip to content

Instantly share code, notes, and snippets.

@manajay
Created June 4, 2018 12:42
Show Gist options
  • Save manajay/203f281453bce8b21e31b5b32c31604e to your computer and use it in GitHub Desktop.
Save manajay/203f281453bce8b21e31b5b32c31604e to your computer and use it in GitHub Desktop.
iOS 动画原理与绘制性能
// iOS动画应用内处理的4个阶段
在iOS中,动画的执行主要分6个阶段,其中4个阶段是在应用内部处理的:
Layout: 这一阶段是准备好view/layer的层级结构并设置layer的属性;
Display: 这一阶段将绘制layer的内容。绘制操作会调用-drawRect:或-drawLayer:inContext:方法;
准备阶段: 这一阶段是Core Animation准备将动画数据发送给render server。另外,还会执行其它一些操作,如解压在动画过程中显示的图片;
提交: 这是应用内部处理的最后一个阶段,Core Animation将打包layer及动画属性并通过IPC发送到render server;
这几个阶段都是由CPU来处理的,而且我们只能控制前面两个阶段,后两个阶段将由Core Animation来控制。
// 导致layer绘制的性能问题
CALayer的大部分属性都是通过GPU来绘制的。以下几类操作可能导致layer绘制的性能问题:
过多的几何形状:这里的瓶颈主要是在对layer的预处理及通过IPC发送到render server这个过程,即CPU的处理,而不是GPU的绘制;
过多的重绘(overdraw):这主要是由绘制重叠的半透明层引起的;
离屏渲染:这个应该比较熟悉,诸如layer的圆角绘制、mask、阴影等操作都会导致离屏渲染,主要是因为需要为离屏绘制的图片分配额外的内存并在绘制上下文之间切换;
过大的图片:如果图片大小超过GPU所支持的最大纹理大小,则在绘制前CPU需要去做预处理。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment