RenderThread vs UI线程

Nik*_*nko 8 multithreading android

来自Android Threads doc:

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

所以我相信屏幕上的所有内容都是由UI线程呈现的.但是在Android Lollipop中他们引入了一个RenderThread:

一个名为RenderThread的新系统管理处理线程即使在主UI线程中存在延迟时也能保持动画流畅

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

Mar*_*cak 18

RenderThread取决于UI Thread但它确实与最后提到的一个并行运行。

它的主要工作是GPUUI Thread.


它是如何工作的?

基本上,它UI Thread充当作业调度员。它准备了要在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 线程?

文档解释说,呈现两个阶段进行:

  1. View#draw -> UI Thread
  2. DrawFrame-> RenderThread,它根据View#draw阶段执行工作。

在较低级别上,当使用硬件加速时,延迟renderingDisplayListCanvas执行 。

在此Canvas实现中,您可以找到上述绘图命令,例如drawCircle.

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