CoreAnimation 与 pop 的对比
最近在 Medium 上看到一篇《Should you use POP?》的文章,文章主要通过以下几个方面来对比了 pop 和 Core Animation。
-
Core Animation工作原理:每次添加动画时QuartzCore会打包其参数,然后通过进程间通信的方式传递给一个名为backboardd的后台进程。然后该进程通过OpenGL渲染和处理layer的层级以及layer上的动画。最重要的一点就是该进程完全独立于你的应用,应用只会拿到动画开始和结束的回调(CAAnimationDelegate),不负责动画的渲染(显式动画除外)。也就是主线程和CoreAnimation不会互相影响,也就是即使主线程阻塞了,CoreAnimation依旧在执行。 -
pop的工作原理:使用CADisplayLink来开启一个fps=60的渲染工作。每当CADisplayLink回调触发时,更新一下动画的进度。也就是每一帧发生改变时都需要通知backboardd来渲染,因为它对于layer的变化并不知情。 -
由于
pop必须在主线程上处理动画,所以pop动画很有可能发生卡顿。作者写了一个Demo来演示对应效果,效果如下图,左边为Core Animation的方式,右边为pop的方式。

- 作者对比了
Core Animation和pop的性能。同样动画效果情况下(运行10s),使用Time Profiler看backboardd(CoreAnimation) 和应用(pop)CPU消耗,iPhone4 iOS7.1.2和iPhone6 iOS8.1.1的对比结果下图所示(左边iPhone4,右边iPhone6)。可以看出两者backboardd进程的CPU耗时差别在100ms左右,但是应用的CPU耗时差距十分明显,Core Animation应用CPU耗时接近于0。


- 结论如下图所示。
Core Animation优点为:①单独进程运行 ②不会阻塞主线程。缺点为:①复杂动画效果要写冗长的代码 ②手势驱动动画比较复杂。pop的优点为:①丰富的 API ②内置很多的动画 缺点为:①在主线程上执行 ②动画过程可能卡顿 ③消耗更高的CPU
