Core Animation 渲染流程
阅读时间3-5分钟
前言
依旧老规矩带着问题来阅读 CoreAnimation 的职责是什么?
流程图
这是苹果官方提供的大量图片中的一张
流程图的解读
整个流程一共有下面几个步骤:
Handle Events
这个过程中会先处理交互事件,这个过程中有可能会需要改变页面的布局和界面层次;这个很好理解。-
Commit Transaction
此时app会通过CPU处理显示内容的前置计算,比如布局计算、图片解码等任务,接下来会进行详细的讲解。之后将计算好的图层进行打包发给 Render Server。 Commit Transaction 这部分中主要进行的是:Layout、Display、Prepare、Commit 等四个具体的操作。- Layout 构建视图,计算视图布局
- Display 绘制视图层(下面提到的图层)
这里需要注意的是
Core Graphics
,这个阶段主要是通过它来完成的,但并不是真正的显示,而是得到图元 primitives 数据。这部分是在CPU中完成的,而后续会通过GPU来得到位图(bitmap)
但是有一个例外:drawRect:
如果开发者重写了这个方法就会在CPU中将layer通过Core Graphics
直接处理成bitmap,就不会在通过GPU来完成bitmap的渲染,这里就涉及到一个概念:离屏渲染
- Prepare 图片解码和转换
- Commit 将处理好的图层打包发送给Decode
Decode
打包好的图层被传输到Render Server
之后,首先会进行解码。注意完成解码之后需要等待下一个 RunLoop 才会执行将具体操作绘制(OpenGL/Metal的操作)转发给下个流程Draw Calls
。 以上三个步骤都是在CPU中完成的。Draw Calls
解码完成后,Core Animation 会调用下层渲染框架(比如 OpenGL 或者 Metal)的方法进行顶点着色器、图元装配、光栅化、片元着色器、混合等渲染工作,进而调用到 GPU。Render
这一阶段主要由 GPU 进行渲染。Display
显示阶段,需要等 render 结束的下一个 RunLoop 触发显示。
更多和渲染有关的可以查看: iOS 渲染原理解析