在Chrome中这会非常复杂,因为渲染者在不同的进程里而非主进程。Chrome某种程度上模拟了OS的行为。表现层监听这些事件,转发消息到根渲染者。遍历树直至到达对应渲染者。这会重绘它自己(通常也包括它的子元素)。
绘制的顺序
CSS2里定义了绘制进程的顺序— http://www.w3.org/TR/CSS21/zindex.html。这实际上是元素堆放在内容栈中的次序。因为栈是从后往前绘制的,所以会对绘制顺序产生影响。块渲染者的栈顺序是:
1 背景色
2 背景图片
3 边框
4 子元素
5 外形
Firefox显示列表
Firefox检查渲染树,为要绘制的矩形建立了显示列表。包含了以正确的绘制顺序(先是渲染者的背景,然后是边框等等)排列的,对应于矩形的渲染者。
这种方式树的绘制只需要遍历一次,而不是先画所有背景,再画所有图片,然后是所有边框这样的遍历多次。
Firefox通过不添加设为隐藏的元素,象被其它不透明元素完全覆盖的元素,来优化这个过程。
Webkit矩形存储
在绘制之前,Webkit把旧的矩形保存成位图。然后只绘制新旧矩形之间的差别部份。
动态改变
浏览器尝试以尽可能最小的动作应对改变。所以改变某元素的颜色只会导致该元素重绘。元素位置的改变会导致元素,它的子元素以及亲戚元素的重新布放和绘制。增加一个DOM节点会导致布局和节点的重绘。重大的改变,象增加”HTML”元素的字号,会导致缓存失效,整棵树都会被重新布放和绘制。
渲染者引擎的线程
渲染者进程是单线程的。几乎所有东西,除了网络操作,都是在单一线程里发生的。在Firefox和safari里这是浏览器的主线程。在Chrome里这是标签页的主线程。
网络操作可以被几个并行线程执行。并行连接的个数是有限的(通常是2-6个连接。Firefox是3个,例如(for iexplorer?),用了6个)。
事件循环
浏览器的主线程是个事件循环。这是个无限循环,保持进程存活。它等待事件(象布局和绘制事件)并处理它们。这是Firefox里主事件循环的代码:
while (!mExiting) NS_ProcessNextEvent(thread);
(待续)
原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/2095.html