AsyncDisplayKit(Texture)原理分析

简介: AsyncDisplayKit Texture 异步渲染

ASDK涉及的UI任务

Layout

  1. 文本宽高计算
  2. 视图布局计算

Rendering

  1. 文本渲染
  2. 图片解码
  3. 图形绘制

UIKit Objects

  1. 对象创建
  2. 对象调整
  3. 对象销毁

ASDK尝试将这些任务放到异步线程处理,如UIKit与CoreAnimation只能在主线程操作的,则进行优化。

ASDisplayNode

UIView与CALayer只能在主线程创建和销毁,所以ASDK创建了ASDisplayNode作为中间类来处理UI关系。当ASDisplayNode不响应触摸时间时,它将只作为CALayer处理。

ASDK的图片预合成

一个Node中,往往包含多个层级的Node组合。当这些Node不需要响应触摸时间,也不需要进行动画和位置变化时,ASDK可以开启预合成功能。

将Node都设置为layer backed后,ASDK会将这些Node合成并渲染成一张图,避免CPU创建UIKit对象的资源消耗,避免GPU多张texture合成和渲染的消耗。

ASDK的多线程

ASK会将布局计算、文本排版、图片/文本/图形的渲染封装成较小的任务,然后用GCD来异步并发执行。

RunLoop 任务分发

信号传递

1.硬件 -(VSync)-> 2.图形服务 -(IPC)-> 3.RunLoop -> 4.SourceObserver(CoreAnimation、CADisplayLink、AutoreleasePool等)

系统作用范围:2,3,4。
App作用范围:3,4。

iOS的显示是由VSync信号驱动的,VSync信号由硬件时钟生成的,每秒发出60次。iOS图形服务收到VSync信号后,会通过IPC通知到App中。App的RunLoop启动后会注册对应的CFRunLoopSource,通过mach_port接受传过来的时钟信号,随后Source的回调会驱动App的动画和显示。

Core Animation

  1. Core Animation在RunLoop中注册了一个Observer,监听BeforeWaiting和Exit事件。这个Observer的优先级是2000000,低于常见的其他ObServer。

  2. 当一个触摸事件到来时,RunLoop被唤醒,App的代码开始执行操作,比如创建和调整View层级、设置View的Frame、修改CALayer透明度、为视图添加一个动画等;

  3. 这些操作会被CALayer捕获,通过CATransacation提交到一个中间状态上。

  4. 当上面所有操作结束后,RunLoop即将进入休眠或退出时,关注该事件的Observer都会接收到通知。这是Core Animation注册的Observer就会在回调中,将中间状态合并提交到GPU进行渲染,如果此处有动画,Core Animation会通过CADisplayLink等机制多次触发相关流程。

ASDK的机制

ASDK就是模拟了Core Animation的机制:当对ASNode的修改和提交涉及到必须主线程运行的函数时,ASNode会将任务用ASAsyncTransaction(Group)封装并提交到一个全局容器中。ASDK也在RunLoop中注册了一个Observer,监听的事件与Core Animation相同(都是BeforWaiting和Exit事件),优先级设置的比Core Animation低。当RunLoop进入休眠前,Core Animation事件处理完毕后,ASDK会执行提交在该Loop的任务。

通过这种机制,ASDK可以合理的把异步、并发操作同步到主线程中,获得不错的性能。

参考资料

iOS 保持界面流畅的技巧

目录
相关文章
|
6月前
|
图形学
小功能⭐️Unity中Texture2D、Sprite、Texture、RenderTexture、image、byte的转换
小功能⭐️Unity中Texture2D、Sprite、Texture、RenderTexture、image、byte的转换
|
6月前
|
存储 缓存 移动开发
PixiJS源码分析系列:第三章 使用 canvas 作为渲染器
PixiJS源码分析系列:第三章 使用 canvas 作为渲染器
|
8月前
|
Linux API 图形学
OpenGL生态中的GL, GLU, GLUT, GLX, GLEW, GLEE和GLEXT详解
该文介绍了OpenGL生态系统中的关键组件,包括GL(基础绘图API)、GLU(提供辅助函数)、GLUT(窗口管理和事件处理)、GLX(X Window系统上的OpenGL扩展)、GLEW和GLEE(动态查询和封装OpenGL扩展)以及GLEXT(OpenGL扩展集合)。这些库和工具协同工作,帮助开发者构建跨平台的图形应用程序,提升兼容性与功能。理解它们的作用对优化OpenGL编程至关重要。
|
9月前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
111 1
Android开发之OpenGL的画笔工具GL10
|
存储 缓存 C++
OpenGL学习笔记(十二):纹理的使用
OpenGL学习笔记(十二):纹理的使用
OpenGL学习笔记(十二):纹理的使用
|
编译器 C语言 C++
OpenGL学习笔记(十一):封装自己的着色器类
OpenGL学习笔记(十一):封装自己的着色器类
OpenGL学习笔记(十一):封装自己的着色器类
|
存储 缓存 API
OpenGL ES 案例04:GLSL加载图片
OpenGL ES 案例04:GLSL加载图片
304 0
OpenGL ES 案例04:GLSL加载图片
|
小程序 图形学 开发者
OpenGL学习笔记(三):了解管线、VAO、VBO的关系,介绍Qt如何使用OpenGL
OpenGL学习笔记(三):了解管线、VAO、VBO的关系,介绍Qt如何使用OpenGL
|
XML 数据库 Android开发
详细聊聊Fragment的实现原理
详细聊聊Fragment的实现原理
|
编解码 API
FFmpeg libswscale源码分析3-scale滤镜源码分析
源码分析基于 FFmpeg 4.1 版本。
332 0
FFmpeg libswscale源码分析3-scale滤镜源码分析

热门文章

最新文章