为什么浏览器不能智能加速硬件而不需要花招?

14

如今有许多网页建议您添加这些规则来使内容获得硬件加速:

transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

这总让我感到荒谬。为什么浏览器需要我的帮助来决定是否启用硬件加速?这样会更快,对吧?那为什么不直接做呢?为什么要等我“欺骗”浏览器呢?


另一个提出这个问题的方式可能是,为什么不在每个基准/重置样式表中包含以下行:

* {
    transform: translate3d(0,0,0);
    -webkit-transform: translate3d(0,0,0);
}

我第一次看到这种技巧是在这个问题中,由Mozilla的一位开发人员给出了一个简短的“不”的答案。这几乎像是为了解决特异性难题而添加!important一样荒谬...但只是几乎。 - BoltClock
2个回答

27
并不是浏览器无法或没有足够的智能来使用硬件加速。实际上,你提到的只适用于WebKit,尤其是移动版本的WebKit。Firefox和IE都会进行硬件加速,并自动将页面分割成在GPU上合成的“图层”。这就是为什么它们通常在渲染速度测试中远远超过Chrome。另一方面,WebKit从未真正适应过多层加速。
由于Firefox和IE可以利用Windows平台上的Direct2D渲染(其中每个绘图操作都是硬件加速的),因此它们必须能够进行硬件加速的合成。如果它们只加速了绘图操作而没有合成,那么它们将失去使用Direct2D的大部分速度优势,因为这需要在GPU和系统内存之间进行复制,这很慢。另一方面,我所知道的所有WebKit渲染后端都完全在软件中执行渲染,并且在合成时(如果正在使用GPU合成)会遇到复制到GPU的惩罚。因此,这最终是一个折衷。如果您要合成的图层在CPU上渲染所需时间不多,则不总是有意义将其复制并在GPU上合成。
由于移动GPU的极度有限性质以及这一点,没有任何WebKit浏览器开始使用自动硬件加速,除非绝对需要(例如设置3D变换)。如果您要我的意见,我还会补充说,我认为WebKit开发人员和支持公司的懒惰在这里也有一定作用。使用GPU是错误的主要来源,因此他们不使用它比修复问题更容易。
顺便说一句,Firefox for Android可以始终进行GPU合成,尽管您可能需要在about:config中启用它;我不知道它是否默认启用。对于个人电脑,我建议使用Firefox或IE以获得快速渲染。

编辑:我还应该补充一点,在最新版本的Android中,谷歌已经为Skia添加了硬件加速功能,它几乎处理了系统上所有2D渲染。目前野外的设备还不多,但这意味着在不久的将来Android上所有的性能都会得到提升。尽管如此,我不知道他们的Skia实现是否能与OpenGL无缝配合。直到解决这个问题之前,合成仍可能产生一些额外的复制。


3
这个答案存在一些误解。"has never really been adapted to have more than simple layers acceleration"(从未真正适应多层加速)是错误的。由于 WebKit 的平台抽象方法(请参见 http://ariya.ofilabs.com/2011/06/your-webkit-port-is-special-just-like-every-other-port.html),基本绘图的加速被委托给平台图形堆栈。在 Mac 上,CoreGraphics 在一定程度上利用 GPU。即使在 Qt WebKit 端口上,也有从 OpenVG、OpenGL、OpenGL ES 等中选择绘图加速的选项。 - Ariya Hidayat
确实,它大多数情况下将绘图委托给平台,但目前除了 Windows 上的 Direct2D 之外,没有任何平台图形堆栈使用太多硬件加速。CoreGraphics 只对 blitting 等简单加速进行简单加速,而像文本这样的复杂事物根本没有加速。我在上面的编辑中谈到了 Android 的 Skia 新版本。据我所知,Qt 端口并未被任何主要的浏览器实现使用,虽然使用 OpenVG 会很棒,但也没有太多可用的实现。 - zhuman - MSFT
另一个例子:在iOS上,不需要使用3D变换来触发图层合成。只要使用CSS对元素进行动画/过渡,合成就会启动(即使该元素没有显式的3D变换矩阵)。 - Ariya Hidayat
@zhuman 我有一个问题。为什么我的Firefox浏览器渲染速度比我的Webkit CSS translate3d()慢? - skmasq
@skmasq 尽管 Firefox 的硬件加速前端通常比软件 WebKit 渲染更快,但在许多情况下执行 DOM 操作、动画和 JavaScript 执行的代码速度较慢。不过他们肯定在不断改进。 - zhuman - MSFT
显示剩余2条评论

1

最后几段文字特别启发人。谢谢! - Domenic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接