外观
主线程、RenderThread、GPU 分别做什么?
标准回答
在普通 View 的硬件加速路径中,主线程处理交互和界面状态,完成必要的测量布局,并更新 RenderNode 中的绘制命令与属性。RenderThread 负责与图形后端交互、组织渲染任务和 GPU 资源。GPU 则执行相应图形计算,把结果写入图像缓冲区。
RenderNode 可以理解为保存一部分绘制命令及变换、透明度等属性的节点。内容没变时,部分记录能够复用;仅改变位置或透明度,不一定要再次执行完整的自定义 onDraw 来重录内容。
这是一条可能并行推进的流水线,不是主线程把每个像素算好再复制给 GPU。RenderThread 也不是万能后台线程:普通 View 的测量布局和多数 UI 更新依然依赖主线程。主线程来不及提供新的状态,渲染线程不能凭空知道业务想显示什么。
关键机制
- RenderThread 是应用渲染链路的一部分,不等同于系统合成进程 SurfaceFlinger。
- GPU 任务提交结束与 GPU 执行完成是两个时刻,常需要同步信号描述资源何时可用。
- 某些独立渲染动画或独立 Surface 可以继续更新,但不能由此断言主线程阻塞不影响所有动画。
通俗例子
复杂 onMeasure 拖住主线程,GPU 即使空闲也等不到正确的新布局;大面积模糊拖慢 GPU,则可能出现主线程很快但帧仍迟到。
追问与回答
RenderNode 和 Bitmap 是一回事吗?
不是。Bitmap 主要表示像素数据,RenderNode 保存的是可用于硬件渲染的绘制记录和属性。复用一份绘制记录,与把某个画面完整缓存为一张图片,是不同层次的优化,也有不同的更新和内存成本。
易混淆点
硬件加速不等于所有工作都在 GPU 上,也不等于主线程已经与画面完全解耦。
参考资料
内容来源
- Android 技术札记 · 原条目
renderthread-gpu