CoreAnimation,提供了高帧率和平滑的动画,使CPU没有负担也没有减慢你的应用程序。能够完成绘制动画的每一帧所需的大部分工作。可以配置动画参数,比如开始点和结束点,然后Core animation完成其余的工作,将大部分工作交给专用的图形硬件来加速渲染(GPU)
Core Animation位于AppKit和UIKit之下,紧密集成到Cocoa和Cocoa Touch的视图工作流中。当然,Core Animation也有接口,可以扩展应用程序视图所暴露的功能,让你对应用程序的动画有更细粒度的控制
CoreAnimation位置Core Animation,它本质上可以理理解为一个复合引擎,主要职责包含:渲染、构建和实现动画。
iOS渲染框架从上图可知App使用CoreGraphics,CoreAnimation,CoreImage来绘制可视化内容,然后通过OpenGL ES/Metal启动GPUDriver,进而启动GPU,然后通过GPU渲染提交到屏幕展示
CoreAnimation渲染流水线CoreAnimation,是一个复合引擎,其职责是 尽可能快地组合屏幕上不同的可视内容,这些可视内容可被分解成独立的图层(即 CALayer),这些图层会被存储在一个叫做图层树的体系之中。从本质上而言,CALayer 是用户所能在屏幕上看见的一切的基础
CoreGraphics, 基于 Quartz 高级绘图引擎,主要用于运行时绘制图像。开发者可以使用此框架来处理基于路径的绘图,转换,颜色管理,离屏渲染,图案,渐变和阴影,图像数据管理,图像创建和图像遮罩以及 PDF 文档创建,显示和分析。当开发者需要在 运行时创建图像 时,可以使用 Core Graphics 去绘制。与之相对的是 运行前创建图像,例如用 Photoshop 提前做好图片素材直接导入应用。相比之下,我们更需要 Core Graphics 去在运行时实时计算、绘制一系列图像帧来实现动画
CoreImage,Core Image 与 Core Graphics 恰恰相反,Core Graphics 用于在 运行时创建图像,而 Core Image 是用来处理 运行前创建的图像 的。Core Image 框架拥有一系列现成的图像过滤器,能对已存在的图像进行高效的处理。大部分情况下,Core Image 会在 GPU 中完成工作,但如果 GPU 忙,会使用 CPU 进行处理
App本身并不负责渲染,渲染由独立进程Render Server负责
首先,App处理事件(HandleEvents:事件处理)
其次,App通过CPU完成对显示内容的计算(如:视图创建、布局、图片解码、文本绘制)
在完成以上两步之后,App对图层进行打包,在下一个Runloop到来时,将打包数据发送给Render Server(即:完成一次Commit Transaction)
Render Server主要执行OpenGL、CoreGraphice程序,OpenGL调度GPU
GPU在物理层上完成渲染流程(顶点数组,顶点着色器,片元着色器)
最后:等到下一个Runloop,进行显示
在实际开发过程中,通常会对界面渲染进行优化(防止卡顿出现),卡顿的出现其实与渲染是息息相关的:
CPU完成对显示内容的计算(如:视图创建、布局、图片解码、文本绘制)后,提交数据到GPU,GPU渲染完成后,将渲染结果放入到帧缓存区,视频控制器读取帧缓存区信息进行数模转换(数字信号转化为模拟信号),逐行扫描视图控制器从帧缓存区读取数据,然后显示到屏幕
在这个过程通常会伴随两种情况,图片的撕裂与掉帧
撕裂产生原因1、关于撕裂的理解,撕裂出现的是由于CPU和GPU在计算时,有时间等待的;帧缓冲区显示的上半部分内容是内容,下半部分内容是新内容;为了解决撕裂,引入了垂直同步Vsync(相当于给帧缓存区加锁,只有信号VSync信号到来时,图片扫描完成)以及双缓冲区
双缓冲区2、关于掉帧的理解,掉帧实际上是重复渲染同一帧数据,启用了垂直同步Vsync+双缓存区解决撕裂问题,接受到垂直信号时,CPU/GPU还未准备好图片数据,视频控制器拿不到FrameBuffer的数据,导致掉帧
掉帧
网友评论