【精简版】浏览器渲染机制(完整流程概述)(下)

简介: 【精简版】浏览器渲染机制(完整流程概述)(下)

CC(浏览器渲染机制之合成器线程做了啥)


其实浏览器绘制的整体流程就是Blink一顿操作,并在paint阶段生成cc的数据源,cc进行一系列操作并最终在draw阶段将结果(CF)提交给viz。也就是说,Blink负责网页内容绘制,cc负责将绘制的结果合成并提交给viz。 (现在说有一点早哈。。。我滴错)


commit


我们在前面的操作得到了什么,得到了Layer list和property tree。


于是,commit阶段的核心作用就是更新Layer list(其实一般都叫它layer tree,但是其实他是list)和property trees的副本到合成器线程(compositor线程,也被称为Impl1线程)。 在commit完成之后会根据需要创建Tiles任务,Tiles任务会被Post到Raster线程。

所以,这个阶段做的事情很好理解,就是把前面主进程的产物拷贝一份到合成器线程。

现在的流程图:


网络异常,图片无法展示
|


Tiling

Tiling阶段介绍


合成器线程接收到数据之后,不会立即开始合成,而是把图层进行分块。这里涉及到一个”分块渲染“的技术,分块渲染会将网页的缓存分成一块一块的,比如:256*256的块,之后进行分块渲染。


为什么要分块渲染?


  • GPU合成通常是使用OpenGL ES贴图实现的,这时候的缓存实际就是纹理(GL Texture),很多GPU对纹理的大小是有限制的,比如长宽必须是2的幂次方,最大不能超过2048或者4096等。无法支持任意大小的缓存。
  • 分块缓存,方便浏览器使用统一的缓冲池来管理缓存。缓冲池的小块缓存由所有WebView共用,打开网页的时候向缓冲池申请小块缓存,关闭网页是这些缓存被回收。 tiling图块也是栅格化的基本单位,栅格化会根据图块与可见视口的距离安排优先顺序进行栅格化。离得近的会被优先栅格化,离得远的会降级栅格化的优先级。


网络异常,图片无法展示
|


分块最后的结果是 cc:TileTask


Tiling阶段总结


这一阶段会对图层进行分块,最终产生 cc:TileTask, cc:TileTask也是下一个阶段的输入。

输入:cc:layer list

输出:cc:TileTask


目前的流程图:


网络异常,图片无法展示
|


Raster(光栅化)

Raster阶段介绍


光栅化会执行每一个TileTask, 将图块转换成颜色值的位图。生成的位图中每个单元都保存着这个位图的颜色值与透明度的编码(比如 FFFFFFF,其实就是RGBA的16进制表示)。


网络异常,图片无法展示
|


不仅如此,光栅化这个过程还会去解码嵌入在页面中的图像资源,绘制操作会引用压缩的数据(比如JPEG,PNG等等),而光栅化会调用适当的解码器对其进行适当的解压。

所以,简单来说,光栅化,就是把图块转换成带有颜色透明度信息的位图的过程。


Raster阶段总结


在这个阶段,会把图块转换成位图,存储在内存中,当然这个内存地址的引用也会被记录,记录在 cc::PictureLayerImpl中(以后会用!)。


输入:cc:TileTask

输出:位图

目前的流程图:


网络异常,图片无法展示
|


Activate


在Commit之后,Draw之前有一个Activate操作。Raster和Draw都发生在合成器线程里的Layer List上,但是我们知道Raster操作是异步的,有可能需要执行Draw操作的时候,Raster操作还没完成,这个时候就需要解决这个问题。


于是它将LayerTree分为了:


  • PendingTree:负责接收commit,然后将Layer进行Raster操作
  • ActiveTree:会从这里取出光栅化好的Layer进行draw操作。

网络异常,图片无法展示
|


如图所示,这样保证了,接下来的操作拿的layer一定是已经光栅化好的。

目的:由于raster是异步的,于是为了使draw拿的数据是raster完成的数据,所以引入了activate这个操作!!!!


目前流程图:


网络异常,图片无法展示
|


Draw

Draw阶段介绍


一看这个名字,就知道整个阶段已经接近了尾声,没错,Draw也确实是合成器线程执行操作的最后一个阶段。


到了Draw这个步骤,当每个图块都被光栅化之后,合成器线程会为每个图块生成draw quads(在屏幕的指定位置绘制图块的指令,也包含了属性树里面的变换,特效等操作),这些draw quads会被封装在CompositorFrame对象里面,CompositorFrame对象也是Render Process(渲染进程)的产物,它会被提交到Gpu Process中。


Draw指的就是 把光栅化的图块,转换成draw quads的过程。 最后CompositorFrame会发送到viz进程(GPU进程)进行最后的渲染。


网络异常,图片无法展示
|


前文说到过,”在Raster阶段,会把图块转换成位图,存储在内存中,当然这个内存地址的引用也会被记录,记录在 cc::PictureLayerImpl中(以后会用!)。“,不知道记不记得这句话,现在用到了,我们要知道draw quads里面有什么。其实我们主要关心的就是,里面有 绘制的操作(paintOp)和对应位图地址的引用。draw quads会被放在CompositorFrame(CF)中,提交给GPU进程,去完成最后一个阶段。


到此,合成器线程的主要工作也做完了。撒花,合成器线程,你辛苦了。


Draw阶段总结


draw阶段将图块转换成draw quads,里面包含绘制指令,属性树的变换,和位图的地址。draw quad是会被放在CompositorFrame这个对象里面,提交给GPU进程。

输入:光栅化完成的图块


输出:饱含大家希望的CompositorFrame

目前的流程图:


网络异常,图片无法展示
|


GPU


VIZ


在 Chromium 中 viz 的核心逻辑运行在 GPU 进程中,负责接收其他进程产生的 viz::CompositorFrame(简称 CF),然后把这些 CF 进行合成,并将合成的结果最终渲染在窗口上。


于是在此,我们的代码就成功的渲染在了网页上了,冰冷的代码变成了温暖的五彩斑斓的页面~~


总结


完整流程图


网络异常,图片无法展示
|

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
9月前
|
存储 前端开发 开发者
|
4月前
|
数据采集 消息中间件 JavaScript
浏览器渲染揭秘:从加载到显示的全过程;浏览器工作原理与详细流程
了解浏览器工作原理与流程,能有效帮助前端开发与性能优化。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
JavaScript 前端开发 API
浏览器渲染过程中如何处理异步任务
在浏览器渲染过程中,异步任务通过事件循环机制处理。JS执行时,同步任务在主线程上执行,形成一个执行栈。异步任务则被推入任务队列中,待主线程空闲时按顺序调用,确保页面流畅渲染与响应。
|
8月前
|
前端开发 JavaScript
宏任务和微任务在浏览器渲染过程中的执行顺序
宏任务和微任务是浏览器事件循环中的两种任务类型。宏任务包括整体代码块、setTimeout等,微任务有Promise.then、MutationObserver等。每个宏任务执行完毕后,会先执行完所有微任务,再进行下一轮渲染或执行下一个宏任务。
|
9月前
|
缓存 自然语言处理 前端开发
浏览器渲染
【10月更文挑战第28天】浏览器渲染涉及将HTML、CSS和JavaScript代码转换为可视网页,主要步骤包括:解析HTML构建DOM树、解析CSS构建CSSOM树、合并DOM与CSSOM生成渲染树、布局确定元素位置和尺寸、绘制元素到屏幕、合成图层形成最终图像。此过程不断优化以提升性能。
|
9月前
|
前端开发 JavaScript 异构计算
简述浏览器的渲染原理
浏览器渲染原理主要包括以下步骤:1)解析HTML文档生成DOM树;2)解析CSS生成CSSOM树;3)结合DOM与CSSOM生成渲染树;4)布局计算(回流)确定元素大小和位置;5)绘制(Paint)将节点转为图形内容;6)合成(Composite)多层图像。整个过程从文档解析到最终输出完整网页,并通过优化技术提升性能。
|
11月前
|
缓存 网络协议 安全
揭秘浏览器背后的神秘之旅:一网打尽HTTP请求流程,让你网络冲浪更顺畅!
【8月更文挑战第31天】当在浏览器中输入网址并按下回车键时,一系列复杂的HTTP请求流程随即启动。此流程始于DNS解析,将域名转化为IP地址;接着是与服务器的TCP三次握手建立连接。连接建立后,浏览器发送HTTP请求,其中包含请求方法、资源及版本等信息。服务器接收请求并处理后返回HTTP响应,包括状态码、描述及页面内容。浏览器解析响应,若状态码为200则渲染页面,否则显示错误页。整个流程还包括缓存处理和HTTPS加密等步骤,以提升效率和保障安全。理解该流程有助于更高效地利用网络资源。通过抓包工具如Wireshark,我们能更直观地观察和学习这一过程。
173 4
|
11月前
|
测试技术 持续交付 开发者
Xamarin 高效移动应用测试最佳实践大揭秘,从框架选择到持续集成,让你的应用质量无敌!
【8月更文挑战第31天】竞争激烈的移动应用市场,Xamarin 作为一款优秀的跨平台开发工具,提供了包括单元测试、集成测试及 UI 测试在内的全面测试方案。借助 Xamarin.UITest 框架,开发者能便捷地用 C# 编写测试案例,如登录功能测试;通过 Xamarin 模拟框架,则可在无需真实设备的情况下模拟各种环境测试应用表现;Xamarin.TestCloud 则支持在真实设备上执行自动化测试,确保应用兼容性。结合持续集成与部署策略,进一步提升测试效率与应用质量。掌握 Xamarin 的测试最佳实践,对确保应用稳定性和优化用户体验至关重要。
135 0
|
11月前
|
缓存 网络协议 Linux
在Linux中,当用户在浏览器当中输入⼀个网站,计算机对dns解释经过那些流程?
在Linux中,当用户在浏览器当中输入⼀个网站,计算机对dns解释经过那些流程?
|
8月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
173 63