Composite

2019-04-02  本文已影响0人  HelenYin

对页面中 DOM 元素的绘制是在多个层上进行的。在每个层上完成绘制过程之后,浏览器会将所有层按照合理的顺序合并成一个图层,然后显示在屏幕上。对于有位置重叠的元素的页面,这个过程尤其重要,因为一旦图层的合并顺序出错,将会导致元素显示异常。
DOM 树中每个节点都会对应一个 LayoutObjectLayoutObject 知道如何在屏幕上 paint Node 的内容。当LayoutObject处于相同的坐标空间时,就会形成一个RenderLayers(PaintLayer) ,也就是渲染层。PaintLayer 最初是用来实现 stacking contest(层叠上下文),以此来保证页面元素以正确的顺序合成(composite),这样才能正确的展示元素的重叠以及半透明元素等等。因此满足形成层叠上下文条件的 LayoutObject 一定会为其创建新的渲染层。

创建PaintLayer常见的 3 类:

  1. NormalPaintLayer
  1. OverflowClipPaintLayer(overflow 不为 visible)
  2. NoPaintLayer(不需要 paint 的 PaintLayer,比如一个没有视觉属性(背景、颜色、阴影等)的空 div)

满足以上条件的 LayoutObject 会拥有独立的渲染层,而其他的 LayoutObject 则和其第一个拥有渲染层的父元素共用一个

从 PaintLayers 到 GraphicsLayers

某些特殊的渲染层会被认为是合成层(Compositing Layers),合成层拥有单独的 GraphicsLayer。而其他不是合成层的渲染层,则和其第一个拥有 GraphicsLayer 父层公用一个。
渲染层提升为合成层的原因有一下几种:

RenderLayers(PaintLayer) 来保证页面元素以正确的顺序合成,这时候就会出现层合成(composite)

每个 GraphicsLayer 都有一个 GraphicsContext,GraphicsContext 会负责输出该层的位图,位图是存储在共享内存中,作为纹理上传到 GPU 中,最后由 GPU 将多个位图进行合成,然后 draw 到屏幕上,此时,我们的页面也就展现到了屏幕上
渲染层提升为合成层的原因有一下几种:

直接原因
后代元素原因

有合成层后代同时本身有 transform、opactiy(小于 1)、mask、fliter、reflection 属性

上一篇 下一篇

猜你喜欢

热点阅读