We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
前面了解到浏览器有软件渲染和GPU硬件加速渲染以及软件绘图的合成化渲染等方式,其中硬件加速渲染算是比较重要的,不过我只是了解了它的一些优缺点,至于浏览器到底如何实现硬件加速机制的,我还不知道,所以,本篇继续跟着书中讲解来了解下硬件加速机制。
硬件加速机制其实就是指使用GPU的硬件能力来帮助渲染网页。
依然采用问题形式。
那是理想情况,现实中不一定。
主要原因是实际中的硬件能力和资源有限。
主要是三件事:
具有以下等特征:
video
由于涉及到不少内部类和方法,考虑到项目一直在迭代,可能书上所讲的有所改变,所以这里提炼下大致过程,尽量不涉及具体类和方法名。
webkit中2D图形上下文对应Chromium的 Skia画布(canvas),具体调用栈可以看图了解下即可。
对于使用多进程模型的Blink内核的浏览器来说,不是的,GPU硬件加速渲染的操作会交由 GPU进程 负责。
这个很复杂,依靠Renderer进程的主要类和GPU进程的主要类它们彼此内部的实现。涉及到太多类,不展开,建议结合项目代码去看。
总结就是,GPU进程处理一些命令后,会向Renderer进程报告自己当前状态,Renderer进程通过检查状态信息和自己期望结果来确定是否满足自己的条件。
值得注意的是:GPU进程最终绘制的结果不再像 软件渲染那样通过共享内存传递给Browser进程,而是直接将页面内容绘制在浏览器的标签窗口。
在架构设计上,采用了 表示和实现分离原则。 图例:
需要注意:Layer树工作的主线程,实际指的是渲染引擎工作的线程,不一定是Renderer进程的主线程。但是LayerImpl树工作的 实现部分的线程 既可以是主线程也可以是单独的线程。实现部分如果是一个单独的线程,那么可以称为 合成器线程,也叫线程化合成。
有以下三点好处:
主要有四个步骤,都是由调度器调度:
可以看看图了解下
2D绘图本身是使用 2D的图形上下文,一般使用软件方式来绘制它们,也就是 光栅化。
使用GPU来绘制2D图形的方法称为2D图形的硬件加速机制。
2D图形的硬件加速机制有两种应用场景:
依靠 Skia图形库。当需要启动硬件加速时,只需要对 SkCanvas 对象进行的相应设置即可。
具体内部类和方法建议看书和代码。
比较复杂,涉及太多内部类,建议结合项目代码和书去看。 简单来说,在Chromium中,canvas 2D进行GPU硬件加速绘图时,会创建一个 SkDeferredCanvas 对象,该对象采用 延迟机制 来绘制2D图形。然后,该对象需要 SkGpuDevice 来将2D绘图操作转换为使用3D图形上下文来绘制。
同样设计太多内部类,建议看书。 粗略提下吧,Chromium中WebGL工作过程分成三个阶段:
The text was updated successfully, but these errors were encountered:
No branches or pull requests
前面了解到浏览器有软件渲染和GPU硬件加速渲染以及软件绘图的合成化渲染等方式,其中硬件加速渲染算是比较重要的,不过我只是了解了它的一些优缺点,至于浏览器到底如何实现硬件加速机制的,我还不知道,所以,本篇继续跟着书中讲解来了解下硬件加速机制。
硬件加速机制其实就是指使用GPU的硬件能力来帮助渲染网页。
依然采用问题形式。
问题
前一篇提到过,在分层的网页结构中,GPU硬件加速渲染会提供相应的后端存储,而网页往往较为复杂,可能会分成很多层,会有很多 RenderLayer 对象,那么GPU是不是要给所有的RenderLayer 对象都进行后端存储?
那是理想情况,现实中不一定。
主要原因是实际中的硬件能力和资源有限。
考虑到资源节省等问题,硬件加速机制是如何去优化、去渲染网页呢?
主要是三件事:
那么哪些 RenderLayer 对象可以组合成 合成层 呢?
具有以下等特征:
video
元素了解了以上的知识后,能说说硬件渲染的过程吗?
由于涉及到不少内部类和方法,考虑到项目一直在迭代,可能书上所讲的有所改变,所以这里提炼下大致过程,尽量不涉及具体类和方法名。
1.首先WebKit确定并计算合成层
2.其次,遍历和绘制每一个合成层,可能存在以下四种情况:
3.最后渲染引擎将所有绘制完的合成层合成起来
前面介绍到webkit中会有3D和2D图形上下文,Chromium是不是也一样呢?内部调用栈是什么样的呢?
webkit中2D图形上下文对应Chromium的 Skia画布(canvas),具体调用栈可以看图了解下即可。
结合以前介绍的进程灯知识,GPU硬件加速渲染是在哪个进程上执行的?是Renderer进程吗?
对于使用多进程模型的Blink内核的浏览器来说,不是的,GPU硬件加速渲染的操作会交由 GPU进程 负责。
多进程模型下是如何实现跨进程的硬件加速渲染的?
这个很复杂,依靠Renderer进程的主要类和GPU进程的主要类它们彼此内部的实现。涉及到太多类,不展开,建议结合项目代码去看。
总结就是,GPU进程处理一些命令后,会向Renderer进程报告自己当前状态,Renderer进程通过检查状态信息和自己期望结果来确定是否满足自己的条件。
值得注意的是:GPU进程最终绘制的结果不再像 软件渲染那样通过共享内存传递给Browser进程,而是直接将页面内容绘制在浏览器的标签窗口。
本篇第一个问题下的回答就提到过合成器,Chromium的合成器是如何实现的呢?
在架构设计上,采用了 表示和实现分离原则。
![](https://raw.githubusercontent.com/lizhongzhen11/dailyGain/master/images/performance.png)
图例:
需要注意:Layer树工作的主线程,实际指的是渲染引擎工作的线程,不一定是Renderer进程的主线程。但是LayerImpl树工作的 实现部分的线程 既可以是主线程也可以是单独的线程。实现部分如果是一个单独的线程,那么可以称为 合成器线程,也叫线程化合成。
Chromium合成器的组成部分是什么样的?
拓展介绍:绘制HTML元素和图片元素所生成的合成层,其后端存储会被瓦片化!
为什么会使用瓦片化的后端存储呢?
有以下三点好处:
了解完合成器知识后,能简要说说合成过程吗?
主要有四个步骤,都是由调度器调度:
可以看看图了解下
前面介绍过2D绘图也可以进行硬件加速,如何做到的呢?
首先什么是2D绘图的硬件加速?
2D绘图本身是使用 2D的图形上下文,一般使用软件方式来绘制它们,也就是 光栅化。
使用GPU来绘制2D图形的方法称为2D图形的硬件加速机制。
2D图形的硬件加速机制有两种应用场景:
2D图形上下文是如何进行硬件加速的呢?
依靠 Skia图形库。当需要启动硬件加速时,只需要对 SkCanvas 对象进行的相应设置即可。
具体内部类和方法建议看书和代码。
Canvas 2D是如何进行硬件加速的呢?
比较复杂,涉及太多内部类,建议结合项目代码和书去看。
简单来说,在Chromium中,canvas 2D进行GPU硬件加速绘图时,会创建一个 SkDeferredCanvas 对象,该对象采用 延迟机制 来绘制2D图形。然后,该对象需要 SkGpuDevice 来将2D绘图操作转换为使用3D图形上下文来绘制。
WebGL是如何实现的?
同样设计太多内部类,建议看书。
粗略提下吧,Chromium中WebGL工作过程分成三个阶段:
读《webkit技术内幕》了解浏览器内核系列
The text was updated successfully, but these errors were encountered: