Flutter渲染原理系列之GPU渲染及屏幕刷新(Async)

670 阅读3分钟

image.png

前言

如何快速高效的掌握一门知识,建议先阅读下这篇文章关于学习的一些看法

Flutter渲染原理系列文章:

Flutter渲染原理系列之开篇问题

Flutter渲染原理系列之runApp执行流程

Flutter渲染原理系列之构建Widget树

Flutter渲染原理系列之构建Element树

Flutter渲染原理系列之构建RenderObject

Flutter渲染原理系列之合成Layer树

Flutter渲染原理系列之GPU渲染及屏幕刷新(Async)

一、概述

Flutter中,GPU渲染屏幕刷新是通过一个异步的事件驱动的机制实现的,主要涉及到几个关键组件:UI线程GPU线程、以及与硬件相关的平台线程(Platform Thread)。

这些涉及到一些更深入的知识,目前只做初步的了解,后续会推出更多专业性的文章。

二、UI线程

  • 构建Widget树:Flutter应用程序运行在UI线程上,主要任务是构建维护Widget树。每当状态发生变化或者需要重绘时,Widget树会触发构建过程。
  • LayoutPaint:构建完成后,系统会对Widget树进行布局计算(Layout),然后绘制(Paint)生成Layer树。

三、Layer树和Rasterization

  • Layer树生成:LayoutPaint阶段后,Flutter引擎会生成Layer树,该树包含了所有需要绘制的图层信息。
  • RasterizationLayer树随后被转换为一系列可由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线程上的渲染时间。
  • JankStutter: 当渲染时间超过16.67毫秒时,会出现Jank(卡顿)或Stutter(画面跳跃),这是因为无法在VSync信号到达前完成一帧的渲染。

八、总结

Flutter中,屏幕刷新GPU渲染是通过一个复杂的异步机制协调的,它涉及到了UI线程GPU线程平台线程之间的紧密合作。通过这种方式,Flutter能够高效地管理和调度资源,以提供流畅的用户界面体验。

码字不易,记得 关注 + 点赞 + 收藏 + 评论