硬件加速:RenderThread处理DrawOp树

400 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

初始化硬件加速环境

在ViewRootImpl的setView方法中会判断如果支持硬件加速就初始化硬件加速的环境并将创建的HardwareRenderer保存到ViewRootImpl的mAttachInfo中

软件绘制和硬件绘制




#### HardwareRenderer.create主要工作




-   建立硬件加速环境
-   **创建HardwareRenderer并保存到ViewRootImpl的attachInfo中**(后续会通过该属性进行硬件加速的构建环节)
-   创建RootRenderNode之后的DisplayList要同步到根RenderNode中
-   为当前widow建立一个ThreadProxy用于向RenderThread提交绘制任务DrawFrameTask(RenderThread中通过Quene来存储这些TASK)




ThreadProxy初始化工作:

启动RenderThread并使用mRenderThread属性引用

向RenderThread提交为当前窗口创建CanvasContext的任务,之后的绘制指令会通过它进行中转

RenderThread


>创建EGLManager(管理EGL Surface,OpenGl上下文),RenderState(渲染状态机),mDisplayEventReceiver(后续接受Vsync事件处理),Looper(用于执行渲染的TASK操作)。**由于RenderThread是单例,因此上面这些属性也都是单例的**




#### mDisplayEventReceiver

接收SF上抛的Vsync信号,通过**监听DisplayEventReceiver的BitTube**来回调编舞者的doFrame方法


### CanvasContext

>也叫作OPENGL的上下文(持有EGLContetx和EGLSurface);在创建RenderThread的时候会向RenderThread发送第一个Task,就是创建CanvasContext

#### CanvasContext.setSurface

1.创建EGLContext和EGLSurface

2.将当前EGLSurface(本质是ANativeWindow)绑定到EGLContext(有多个EGLSurface的时候控制渲染哪个Surface)

持有**mRenderThread,rootRenderNode,mEglManager**这些属性

ANativeWindwos其实是EGLSurface在native层的Surface对象,通过eglManager创建

>Window持有ViewRootImpl持有attachInfo持有mHardWare---》创建持有ThreadProxy---》ThreadProxy提交创建CanvasContext的申请,CanvasContext中创建EGLContext,EGLSurface并绑定需要渲染的Surface---》持有RenderThread等待Vsync信号

摘一张图:

总结流程

初始化流程

image.png

参考文章

android硬件加速

GPU渲染简介

GPU和CPU的渲染和渲染管道出图原理

Android硬件加速(二)-RenderThread与OpenGLGPU渲染