这里回顾下显示系统的经典示意图
在进行绘制的时候,RenderThread是怎样被调起来进行渲染的呢,在这里,我们继续通过对一个知识点的学习来作为基础发散点,来认识整个流程,实现整个知识点的贯穿:从点到线,再发散到面。
在view的绘图方法onDraw(Canvas canvas)中,我们可以添加log和堆栈,可以发现,onDraw所在的线程就是主线程,onDraw是在UI线程中执行的,渲染则是另外处理的,
以下方法中的updateRootDisplayList 会调用到view的onDraw方法,实现绘图命令树的构建(DisplayList)
/*frameworks/base/core/java/android/view/ThreadedRenderer.java*/
void draw(View view, AttachInfo attachInfo, DrawCallbacks callbacks) {
...
// 1.记录每个View节点的绘制操作命令,完成绘制操作命令树的构建
updateRootDisplayList(view, callbacks);
...
// 2.JNI调用同步Java层构建的绘制命令树到Native层的RenderThread渲染线程,并唤醒渲染线程利用OpenGL执行渲染任务;
int syncResult = syncAndDrawFrame(choreographer.mFrameInfo);
...
}
里面的syncAndDrawFrame方法唤醒RenderThread进行处理。
了解了这个主干道,就可以有个大概认识,再去了解各细节。
参考资料: