浏览器渲染过程详解

1.RenderObject(绘制可见内容的实体)

  • RenderObject上实现了将对应DOM节点绘制进位图的方法,负责绘制DOM节点可见内容

因为有层的覆盖

2.RenderObject 生成 RenderLayer 的条件(定义层的单位)

  • 每个RenderLayer的子Layer放在两个升序列表

    • negZOrderList储存z-index为负的renderLayer
    • posZOrderList储存z-index为正的renderLayer
  • 根元素

  • 明确的 CSS 定位属性(relative,absolute,transform)

  • 是透明的(transparent)

  • 有 overflow,alpha mask 遮罩,reflection

  • CSS filter

  • 有 3D 上下文或者加速 2D 上下文的画布(canvas)

  • video 元素


因为动画需要快速绘制,单独提取

3.RenderLayer 生成 Graphics Layer(合成层)

  • 3D或透视变换(perspective,transform)
  • 使用加速视频解码的元素
  • 拥有3D上下文或者加速2D上下文
  • 混合插件(flash)
  • 对opacity,transform,fliter,backdropfilter应用了动画或者渐变
  • will-change设置为opacity,transform,top,left,bottom,right
  • 拥有加速CSS过滤器的元素
  • 拥有低z-index且包含一个复合层的兄弟元素
  1. 将不需要特殊处理能合成的直接合成一个 renderLayer
  2. 将不能被直接合成的多个静态 renderLayer 特殊处理后合成为一个 Graphics Layer
  3. 将静态的 Graphics Layer 和动态的 Graphics Layer 进行动静合成成最终的合成

  • Graphics Layer负责将自己的Render Layer及其子代所包含的Render Object绘制到位图里。然后将位图作为纹理交给GPU。所以现在GPU收到了HTML元素的Graphics Layer的纹理,也可能还收到某些因为有3d transform之类属性而提升为Graphics Layer的元素的纹理.
  • 现在GPU需要对多层纹理进行合成(composite),同时GPU在纹理合成时对于每一层纹理都可以指定不同的合成参数,从而实现对纹理进行transform、mask、opacity等等操作之后再合成,而且GPU对于这个过程是底层硬件加速的,性能很好。最终,纹理合成为一幅内容最终draw到屏幕上.

4. 具体实现

  1. 相关进程
  • 渲染进程:每个tab一个,负责执行js和页面渲染
    • 主线程(Main Thread)
    • 合成器线程(Compositor Thread)
    • 瓦片工人线程(Tile Worker)
  • GPU进程:整个浏览器一个,负责将Render进程绘制好的瓦片位图作为纹理上传到GPU,并调用GPU相关方draw到屏幕上
    • GPU线程(GPU Thread)
  1. 相关线程工作
  • 主线程
    JS执行,重新计算样式,更新层树,写进位图,合成层

  • 合成器线程
    接受浏览器发出的垂直同步信号,也接受OS传来的用户交互(滚动,输入,点击)

  • 如果可能,合成器线程会自己处理这些内容,转换为对layer的位移和处理,并将新的帧commit到GPU线程,直接输出页面
  • 如果你在滚轮事件注册了回调,这时合成器线程就会唤醒主线程,让后者执行JS,完成DOM的计算重排,产出新的纹理,再commit到GPU Thread
  • 瓦片线程
    由Compositor 线程创建,专门将瓦片光栅化
  1. 整体流程

  2. 接收到Vsync信号,新的一帧开始

  3. 合成器线程将之前接收到的用户UI交互传给主线程处理
    限定每帧一次

  4. requestAnimationFrame

  5. parse HTML dom变动解析dom

  6. Recalc Styles 重新计算样式

  7. Layout重排,

  8. update layer tree
    处理层变动

  9. Paint
    记录哪些绘画调用,放进一个列表

  10. 主线程计算各种混合参数并把数据交给合成器线程,接着处理input回调

  11. Raster Scheduled and Rasterize
    光栅化

  12. commit
    所有瓦片被光栅化后,合成器线程就会commit到GPU线程,GPU线程把位图作为纹理上到到GPU里,并调用平台对应3DAPI把所有纹理绘制到一个位图里,从而完成纹理的合并

5.具体细节

  1. 重排,强制重排
    大小位置改变会触发重排,如果在标记为dirty的情况下访问了offsetTop等属性就会强制重排

  2. 重绘
    以合成层为单位

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343