转载请注明出处:http://blog.csdn.net/yunchao_he/article/details/41698169
多个图形上下文(GraphicsContext,也称为3D Context, GL Context)
众所周知,使用OpenGL/D3D绘图,或者GDI, GTK/Cario, QT, X11, Skia等与绘图相关的库时,有图形上下文(GraphicsContext)这个概念。它和进程上下文有类似之处,只不过它保存绘图有关的信息,比如当前申请的Buffer, Texture, FBO等对象,以及这些对象的属性,如Texture的tile mode(repeat, mirror),以及变换矩阵,投影矩阵,光照信息,线宽,线的颜色,裁剪区大小,alpha混合模式和参数,等等众多相关属性。在Chromium里,由于其多进程构架以及Web内容的复杂性, 它可能包含以下多个GraphicsContext:
首先,网页中的一些特殊元素或组件在Chromium里往往有自己的GraphicsContext,这些特殊元素是WebGL,Canvas2D, Video, Pepper3D等。页面中每出现一个特殊元素,Chromium都会创建一个独立的GraphicsContext。另外,包含其它所有元素的Base Layer(也称Root Layer)也有自己的GraphicsContext。它们都是绘制到off-screen的FBO, 比如PixelBuffe或者Texture上。
其次,RenderCompositor将上述的各个Layer合成,合成过程中也会创建自己的GraphicsContext,它也是绘制到off-screen的FBO。
最终,BrowserCompositor把网页内容和UI合成,也会创建GrapicsContext,这一次合成的结果将绘制到屏幕上。它对应着on-screen Framebuffer。对于最常见的双buffer系统,它会绘制到back buffer, 然后通过swap buffer在屏幕上显示。
虚拟上下文:Virtual Context
对