Chromium 软件渲染
- 软件渲染就是利用
CPU
,根据一定的算法来计算生成网页的内容;
Chromium
都是用软件渲染的技术来完成页面的绘制工作(除非强行打开硬件加速绘制);
软件渲染基础和架构
Renderer
进程:
* RenderWidget
对象,它负责调度页面渲染和页面更新等操作以及和Browser
进程的通信;
* PlatformCanvas
,即SkiaCanvas
,Render
树的绘制操作中Canvas
的元素的实现;
Browser
进程:
* RenderWidgetHos
对象,负责同Renderer
进程的通信;
* BackingStore
,它是一个后端的存储空间,大小通常是网页可视区域的大小,该空间存储的就是页面的绘制结果;
- 两个进程之间的通信:
WebKit
负责遍历Render
树,每个RenderObject
节点根据需要来绘制自己和子节点的内容到目标存储,就是SkiaCanvas
所对应的共享内存的Bitmap
中;之后,RenderWidgetHost
把bitmap
复制到backingstore
的相应区域中,并调用paint
来把自己绘制到窗口中;
具体渲染过程
发起重新绘制某些区域的请求
- 前端请求:包括从
browser
进程发起的请求,可能是browser
自身的,也有可能是其他窗口系统;
- 后端请求:由页面自身发起更新部分区域的请求,如
HTML
元素或者样式的改变,动画等等。
例子:JS
代码每隔50ms更新元素;
Renderer
进程的message loop
调用处理Invalidation
的回调函数,该函数主要调用RenderWidget::DoDeferredUpdate
来完成绘制请求;
RenderWidget::DoDeferredUpdate
首先调用layout
来触发检查是否有需要重新计算的布局和更新请求;
RenderWidget
调用TransportDIB
来创建共享内存,内存大小为绘制区域的高×宽×4,同时调用Skia
来创建一 个canvas
,它的绘制目标是一个使用共享内存存储的bitmap
;
- 当渲染该页面的全部或者部分时,
ScrollView
请求按照从前到后顺序遍历并绘制所有的RenderLayer
的内容到目标的bitmap
中,每个RenderLayer
的绘制通过以下步骤来完成:
* 首先计算重绘的区域是否和自己有重叠,如果有, 则要求该layer
中的所有RenderObject
对象绘制自己;
- 绘制完成后,发送
UpdateRect
的消息给browser
进程,Renderer
进程同时返回完成绘制;Browser
进程接受到消息后首先由BackingStoreManager
来获取或者创建 BackingStoreX
,大小是 Viewport,包含对于整个网页的坐标信息,它根据UpdateRect
的更新区域的位置信息将共享内存的内容绘制到自己的对应存储区域中;
- 最后
Browser
进程发送UpdateRect
的ACK
消息给renderer
进程;
同硬件加速渲染的对比
- 软件渲染有一个重要的影响性能的地方来自于共享内存后的复制到
backingstore
的操作,这样做的原因包括
* 共享内存是很宝贵的资源;chromium
浏览器可能包多个Renderer
进程,在使用完后,因尽快地释放共享内存;
* 重新绘制网页内容的需要;当 X 有请求更新浏览器窗口的某个区域时,在此情况下,网页内容可能没有任何的改变,因而如果在浏览器端有一个backingstore
保存网页的内容,那么不需要WebKit
重新渲染;
- 同硬件加速渲染另外一个很不同的地方就是对更新区域的处理;,当网页中有一个更新某个区域的请求时,硬件渲染可能只需要对其中的一层重新绘制,然后重新合成即可;但在软件渲染过程中,因为没有为每一层提供后端存储,因而它需要将和这个区域有重叠部分的所有层次重新绘制一遍,因而某些情况下开销比较大;
- 软件渲染的优势:
* 很多场景适合用软件渲染,而且速度更快;一般的网页,用软件渲染速度更快,用了硬件加速可能会造成较大地额外负载,一般网页的文字和图片对现代CPU
来说不是什么大问题;
* 相比较硬件加速渲染,它不需要GPU
内存和其他资源;硬件加速渲染需要很多的GPU
内存资源,因为它会每个层分配内存对象,很多时候GPU
资源紧张;
Chromium的GPU硬件加速
GPU
硬件加速是指应用GPU
的图形性能把chromium
中的一些图形操作交给GPU
来完成,因为GPU
是专门为处理图形而设计,所以它在速度和能耗上更有效率;但是,使用GPU
加速有些额外开销,并且某些图形操作CPU
完成的会更快,因而不是所有的操作都合适交给GPU
来做;
Chromium
中,GPU
加速不仅应用于3D
,而且也可以应用于2D
;这里,GPU
加速通常包括以下几个部分:
* Canvas2D
;
* 布局合成(Layout Compositing);
* CSS3转换(transitions);
* CSS3 3D变换(transforms);
* WebGL 和视频 (video);
启用GPU加速
- 检查:
about:gpu/chrome://gpu
;
进程模型
- 由于
chromium
的安全模型和稳定性考虑,GPU
加速也采用多进程模型来实现;所以的GPU
加速相关的操作均有一个独立的进程来完成,这就是GPU
进程;
GPU
进程由Browser
进程来创建和销毁;它们之间的通信是通过chromium
的IPC
消 息机制实现的;
Chromium
只会创建一个GPU
进程,该进程被所有的Renderer
进程和 Pepper plugin
进程所共享,但是GPU
进程会为不同的进程创建不同的command buffer
的示例;
- 对于一个
Renderer
进程,GPU
进程也可以为其创建多个示例,这取决于 Renderer
进程的需求;
GPU
进程最终绘制的结果不再像软件渲染那样通过共享内存传递给Browser
进程,而是直接将页面的内容绘制在浏览器的标签窗口内;
Command Buffer
Command Buffer
主要用于GPU
进程和GPU
的调用者进程传递GPU
操作命令;
posted @
2015-12-14 18:45
JinksPeng
阅读(
575)
评论()
编辑
收藏
举报