iOS动画(二)

116 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

本文同时参与「掘力星计划」,赢取创作大礼包,挑战创作激励金

通过问题看本质!!!

渲染和动画

1--1.png

如果做动画的话,最后的两个步骤会一直重复直到动画结束。

布局Layout

设置 layer 的属性,如 frame,background color 等等。

显示Display

创建 layer 的 backing image,通过 setContents 、 [drawRect:] 、 [drawLayer: inContext:]

准备Prepare

Core Animation 框架准备要渲染的 layer 的各种属性数据,以及要做的动画的参数,准备传递給 render server。同时在这个阶段也会解压要渲染的 image。(除了用 imageNamed:方法从 bundle 加载的 image 会立刻解压之外,其他的比如直接从硬盘读入,或者从网络上下载的 image 不会立刻解压,只有在真正要渲染的时候才会解压)。

当这些数据到达 render server 后,会被反序列化成 render tree。然后 render server 会做下面的两件事:
  • 计算 Calculates 根据 layer 的各种属性(如果是动画的,会计算动画 layer 的属性的中间值),用 OpenGL 准备渲染。
  • 渲染 Renders 渲染这些可视的 layer 到屏幕。
CoreAnimation

CoreAnimation————翻译机,一个中间者,把 编写的 UIKit、CoreAnimation 级别的代码,转换为另外一种描述,类似 LLVM 的 IR,通过 IPC ( inter-process communication ),将翻译好的 UI 信息提供给系统常驻的UI绘制进程。通过系统服务完成真正的使用低级 API 操作 GPU 完成渲染的任务 。

优化相关

离屏渲染

在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

圆角

没有contents和子视图,直接用cornerRadius 用CoreGraphics为图片裁剪圆角 创建四个白色弧形的layer盖住四个角,从视觉上制造圆角的效果

阴影

使用shadowPath来规避离屏渲染

光栅化

shouldRasterize开启,代表layer会缓存起来 适用于耗费资源较多的静态内容,不经常更新的,能复用的场景