前言
如何快速高效的掌握一门知识,建议先阅读下这篇文章关于学习的一些看法。
Flutter渲染原理系列文章:
Flutter渲染原理系列之GPU渲染及屏幕刷新(Async)
一、概述
在Flutter中,GPU渲染和屏幕刷新是通过一个异步的、事件驱动的机制实现的,主要涉及到几个关键组件:UI线程、GPU线程、以及与硬件相关的平台线程(Platform Thread)。
这些涉及到一些更深入的知识,目前只做初步的了解,后续会推出更多专业性的文章。
二、UI线程
- 构建
Widget树:Flutter应用程序运行在UI线程上,主要任务是构建和维护Widget树。每当状态发生变化或者需要重绘时,Widget树会触发构建过程。 Layout和Paint:构建完成后,系统会对Widget树进行布局计算(Layout),然后绘制(Paint)生成Layer树。
三、Layer树和Rasterization
Layer树生成:Layout和Paint阶段后,Flutter引擎会生成Layer树,该树包含了所有需要绘制的图层信息。Rasterization:Layer树随后被转换为一系列可由GPU理解的Rasterization指令。这个过程由Skia图形库处理,生成Command Buffer。
四、GPU线程
Command Buffer提交:Command Buffer包含了一系列GPU指令,这些指令会被提交给GPU线程。GPU渲染:GPU线程接收到指令后,使用其内部的渲染管线来执行这些指令,将它们转换为像素数据并填充到Framebuffer中。
五、平台线程和VSync信号
VSync信号:平台线程负责管理与硬件相关的事件,其中包括向UI线程发送VSync信号。VSync信号告诉UI线程何时应该开始下一帧的渲染,以与屏幕刷新率同步。屏幕刷新:当一帧的渲染完成并填充到Framebuffer后,屏幕会在下一个VSync信号到达时刷新,显示新渲染的一帧画面。
六、异步机制
Flutter的渲染流程是高度异步的,这意味着UI线程不会等待GPU线程完成渲染。UI线程在接收到VSync信号后就开始准备下一帧的渲染,而GPU线程则继续处理前一帧的Command Buffer。
七、性能考量
60fps目标:Flutter设计的目标是达到每秒60帧(60fps)的流畅度。为了实现这一点,每一帧的渲染时间应该控制在16.67毫秒内,这包括了UI线程上的布局和绘制,以及GPU线程上的渲染时间。Jank和Stutter: 当渲染时间超过16.67毫秒时,会出现Jank(卡顿)或Stutter(画面跳跃),这是因为无法在VSync信号到达前完成一帧的渲染。
八、总结
在Flutter中,屏幕刷新和GPU渲染是通过一个复杂的异步机制协调的,它涉及到了UI线程、GPU线程和平台线程之间的紧密合作。通过这种方式,Flutter能够高效地管理和调度资源,以提供流畅的用户界面体验。
码字不易,记得 关注 + 点赞 + 收藏 + 评论