由于csdn的博客不支持太多字符(估计是加上样式后源码字母太多了),文章被截断了许多。
详细原文请直接查看转载出处:
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,包
Chromium软件渲染解析
本文介绍了Chromium浏览器中软件渲染的基础架构与流程。Renderer进程通过RenderWidget对象进行页面渲染及更新,而Browser进程则通过RenderWidgetHost进行通信,并将绘制结果呈现在窗口中。文章还详细说明了重新绘制的过程。
434

被折叠的 条评论
为什么被折叠?



