渲染线程 vs UI 线程

25

来自Android线程doc

您不能从工作线程操作用户界面,必须从UI线程对用户界面进行所有操作

因此,我认为屏幕上的所有内容都由UI线程呈现。但在Android Lollipop中,他们introduced了一个RenderThread

一种新的系统管理处理线程称为RenderThread,即使主UI线程存在延迟,也可以保持动画平滑

它是如何工作的? RenderThread是否使用UI线程在屏幕上渲染动画(具有新属性的视图)?如果是这样,为什么不会阻塞UI线程

2个回答

25

RenderThread 依赖于 UI Thread,但它会与后者并行运行。

它的主要工作是在 GPU 上运行昂贵的计算,以卸载 UI Thread 的重负。


它是如何工作的?
基本上,UI线程充当作业调度程序。它准备了一系列命令在RenderThread上执行。
GPU不知道动画是什么;它只能理解基本命令,例如:
- translation(x,y,z) - rotate(x,y)
或基本绘图工具:
- drawCircle(centerX, centerY, radius, paint) - drawRoundRect(left, top, right, bottom, cornerRadiusX, cornerRadiusY, paint)
将它们组合在一起,就形成了您在屏幕上看到的复杂动画。
RenderThread是否使用UI线程在屏幕上呈现动画(具有新属性的视图)?
不,它是异步运行的。
如果是这样,为什么它不会阻塞UI线程?
文档docs解释了渲染分为两个阶段进行:
  1. View#draw -> UI 线程
  2. DrawFrame -> Render 线程,该线程根据 View#draw 阶段执行工作。

在使用硬件加速时,更底层的操作是由 DisplayListCanvas 执行的延迟渲染。

在这个 Canvas 实现中,您可以找到前面提到的绘图命令,例如 drawCircle

因此,DisplayListCanvas 也是 RenderNodeAnimator 的绘图目标,它运行基本的动画命令(translatescalealpha 等)。


3
渲染线程顾名思义只是在onDraw()中进行渲染,UI线程则进行onMeasure()onLayout()等操作。将这些操作分离出来的概念是为了在不阻塞渲染的情况下完成测量和计算等繁重工作,以实现平滑的fps
请观看此视频

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接