本篇文章主要介绍了"Chromium硬件加速渲染的UI合成过程分析",主要涉及到require,队列,更新UI,IPC,memset方面的内容,对于移动开发感兴趣的同学可以参考一下:
在Chromium中,Render端和WebGL端绘制出来的UI最终是通过Browser端显示在屏幕上的。换句话说,就是Browser端负责合成R...
在Chromium中,Render端和WebGL端绘制出来的UI最终是通过Browser端显示在屏幕上的。换句话说,就是Browser端负责合成Render端和WebGL端的UI。这涉及到不同OpenGL上下文之间的资源传递和同步问题。其中,资源传递问题通过Mailbox机制解决,同步问题通过Sync Point机制解决。本文接下来就分析Browser端合成Render端和WebGL端UI的过程。
老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!
Render端负责绘制的是网页UI。在Chromium中,网页UI被抽象为一棵Layer Tree,每一个Layer都用一个Layer对象描述,如图1最左边的图所示:

图1 Layer Tree、Pending Layer Tree和Active Layer Tree的关系
WebGL端负责绘制的是网页中的Canvas%e6%a0%87%e7%ad%be/' target='_blank'>Canvas标签。在Chromium中,网页中的Canvas%e6%a0%87%e7%ad%be/' target='_blank'>Canvas标签被抽象为一个TextureLayer对象,作为一个Layer出现在用来描述网页UI的一棵Layer Tree中。
Render端在内部维护了三棵Tree。除了上述的Layer Tree外,另外两棵Tree分别是Pending Layer Tree和Active Layer Tree。在Pending Layer Tree和Active Layer Tree中,每一个Layer都用一个LayerImpl对象描述。相应地,网页中的Canvas%e6%a0%87%e7%ad%be/' target='_blank'>Canvas标签在Pending Layer Tree和Active Layer Tree中被抽象为一个TextureLayerImpl对象。
Layer Tree由Render端的Render线程维护,而Pending Layer Tree和Active Layer Tree由Render端的Compositor线程维护。Render线程通过解析网页内容得到Layer Tree。Pending Layer Tree相当于是Layer Tree的一个副本。每当Layer Tree发生变化时,Compositor线程都会将其同步(Synchronize)到Pending Layer Tree中去。Pending Layer Tree经过光栅化(Rasterize)处理后,就变成Active Layer Tree。Active Layer Tree代表的是一个可以被Browser端合成的UI。
Layer Tree和Pending Layer Tree的存在使得Render线程和Compositor线程可以并发绘制网页的UI,如图2所示:

图2 网页UI并发绘制示意图
这相当于是网页UI的某一帧绘制分为两部分。前半部分由Render线程处理,后半部分由Compositor线程处理。其中,第N+1帧的前半部分和第N帧的后半部分可以并发处理。这一点类似于Android 5.0应用程序UI硬件加速渲染机制,具体可以参考Android应用程序UI硬件加速渲染技术简要介绍和学习计划这个系列的文章。其中,这里的Render线程和Compositor线程就相当于Android 5.0应用程序进程中的Main线程和Render线程。