美文网首页
CoreAnimation的渲染中角色

CoreAnimation的渲染中角色

作者: 张墩墩 | 来源:发表于2020-07-06 20:02 被阅读0次

1、CoreAnimation

CoreAnimation是苹果提供的一套基于绘图的动画框架。其本质是一个复合引擎。主要职责是渲染、构建和实现动画。

core animation

事实上app 本身并不负责渲染,渲染则是由一个独立的进程负责,即 Render Server进程。
App 通过 IPC 将渲染任务及相关数据提交给 Render Server。Render Server 处理完数据后,再传递至 GPU。最后由 GPU 调用 iOS 的图像设备进行显示。

ios 渲染框架

Core Animation 流水线的详细过程:

  • 首先由app处理Handle Events响应事件,如:用户的点击操作,在此过程中 app 可能需要更新 视图树,相应地,图层树 也会被更新。
  • 其次Commit Transaction操作:app通过 CPU 完成对显示内容的计算,如:视图的创建、布局计算、图片解码、文本绘制等。完成对显示内容的计算之后,app对图层进行打包,并等待下一次runloop提交到RenderServer(Render Server主要执行 Open GL、Core Graphics 相关程序,并调用 GPU。GPU 则在物理层上完成了对图像的渲染),即完成了一次 Commit Transaction 操作。
  • 最后GPU 通过 Frame Buffer、视频控制器等相关部件,将图像显示在屏幕上。
core animation 流水线

Render Server 的主要操作:

  • GPU 调用顶点着色器、片元着色器,对Core Animation 处理好的数据进行解析处理、图元转换、生成Render Buffer ,下一次runloop到来时渲染到屏幕上。


    Render Server 操作

2、图像的显示流程

图像 --> CPU进行解码,交给GPU --> GPU进行图像渲染-->存储到帧缓存区-->视频控制器读取帧缓存区信息,并刷新部件(视频控制器只是负责帧缓存区与显示器的对应关系) --> 显示器逐行扫描显示。 图像的显示流程

3、计算机渲染

  • 随机扫描:早先的显示器,电子枪的随机扫描(显示文件>显示处理器>显示器,通过电子光束随机扫描)
  • 光栅扫描:按照一定方向扫描,从屏幕左上角一排一排的往下扫描(通过像素点逐行扫描显示到显示器上。如下图:)
光栅扫描
  • 帧缓冲区的数据-->视频控制器,视频控制器读取信息进行数模转化-->进行光栅扫描 -->显示在显示器上。
  • 人眼有视觉暂留,一般最低每秒16帧就能让人的视觉感觉连贯

3、屏幕撕裂、掉帧

  • 屏幕撕裂:视频控制器拿到帧缓冲区数据显示的时候,这一帧的数据还未显示完,新一帧的数据已经来了,就会开始扫描新一帧的数据,此时帧缓冲区存储旧数据展示到屏幕上时帧缓冲区读取下一帧数据展示到屏幕,但是刷新不及时,就会出现撕裂。
  • apple 解决方法:垂直同步 Vsync+ 双缓存 DoubleBuffering(两个缓冲区 轮番的对图像进行处理展示)
  • 垂直同步Vsync:在缓冲区加锁,保证逐帧的扫描,当前帧扫描不完的时候不去扫描下一帧 。防止出现撕裂的情况。

启用的垂直同步,双缓存时候,解决了屏幕撕裂的问题。但出现了新问题,当接收到垂直信号,CPU、GPU图片数据还没处理好 -> 拿不到framebuffer--.>屏幕没有办法渲染新的数据还展示上一帧的数据。造成上一帧重复渲染,叫掉帧(卡了)。

掉帧

A信号重复渲染

三缓冲区:(GPU CPU 闲置时间,A 显示屏幕,B也渲染好了) 三缓冲也可能出现掉帧,比双缓冲好。

屏幕卡顿原因:
  • CPU/GPU 渲染流水线消耗时间过长-->造成掉帧
  • 垂直同步Vsync + 双缓存区DoubleBuffering 以掉帧作为代价 =>解决屏幕撕裂
  • 三缓冲区:合理使用CPU/GPU 减少掉帧次数。

相关文章

网友评论

      本文标题:CoreAnimation的渲染中角色

      本文链接:https://www.haomeiwen.com/subject/iwgbqktx.html