小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
本文同时参与「掘力星计划」,赢取创作大礼包,挑战创作激励金
通过问题看本质!!!
渲染和动画
如果做动画的话,最后的两个步骤会一直重复直到动画结束。
布局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会缓存起来 适用于耗费资源较多的静态内容,不经常更新的,能复用的场景