CoreAnimation 渲染流程CoreAnimation 渲染流程

2021-08-09 13:43:42 浏览数 (1)

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 渲染原理解析

0 人点赞