为什么在CSS3中启用硬件加速会降低性能?


82

我使用由过渡移动6000个小div元素在CSS3实验top: 0top: 145px测试性能。

使用没有硬件加速运行平稳谷歌浏览器。

如果我通过translateZ(0)性能启用硬件加速,将变得可怕。

为什么呢?

这是我的示例代码:http : //dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html


更新(2014-11-13):由于这个问题仍在引起人们的注意,我想指出的是问题本身似乎仍然存在,尽管在现代硬件提供的演示中可能不再可见上述的卡顿现象。较旧的设备可能仍然会遇到性能问题。


9
真正的问题是,为什么某些浏览器希望作者使用诸如“空”转换之类的愚蠢黑客手段来激活硬件加速。Firefox尽可能地使用GPU,而IE选择加速_ALL_ THEINGS!但是,这仍然是一个有趣的问题,因为它似乎表明,这种黑客有时甚至会适得其反。
BoltClock

2
@ BoltClock'saUnicorn基本上我同意你的看法。但是,跨浏览器问题不是总是这样吗?:-)
Timo 2012年

6
我很早以前就问了这个问题,但现在我注意到移动的项目数似乎对该问题有很大的影响。使用3D加速时,移动少量大物体比移动许多小物品更有效,因为所有3D加速层都必须转移到GPU并返回。因此,即使GPU表现出色,许多对象的传输也可能会成为问题,因此使用GPU加速可能不值得。
Timo

1
我在任何浏览器上的示例中均未发现性能差异,并且投票决定不再具有可重复性。
杰森·C

1
@Timo刚刚检查了最新的Firefox和Chrome,以及Windows 7 64位上的IE11,以及相当老的配备nVidia 4200M的2.3 GHz i5 Thinkpad上的硬件,这两个选项对我来说似乎都很顺利。耸耸肩
Jason C

Answers:


100

我总是补充:

-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;

使用3d变换时。甚至是“假” 3D变换。经验告诉我,这两条线总是可以提高性能,尤其是在iPad上和Chrome上。

我确实对您的示例进行了测试,据我所知,它确实有效。

至于您的问题的“为什么”部分……我不知道。3D变换是一个年轻的标准,因此实现起来很不稳定。这就是为什么它是一个前缀属性:用于beta测试的原因。有人可以填写错误报告或问题,然后让团队进行调查。

2013年8月19日编辑

有一个关于这个答案经常性活动,我只是失去了一个小时,发现IE10也需要这个。所以不要忘记:

backface-visibility: hidden;
perspective: 1000;

3
我做了另一个测试。基本上与测试#1相同,但是这次我让盒子也通过-webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html绕z轴旋转-这次,硬件加速版本更快!如果删除旋转,则硬件加速会降低动画的速度。如果您的理论是正确的,那么这将不起作用(因为唯一的区别是我添加了rotateZ(360))。另一方面,也许chrome很聪明,可以意识到绕Z轴旋转不需要重新绘制这些图块的背面吗?
2012年

1
在iOS6中不再是这种情况:-(
Michael Mullany 2012年

2
@Timo请注意,w3schools不隶属于w3c:w3fools.com
Kyle Robinson Young

7
您应该在何处添加这些行,而不仅仅是一般的“仅添加此行。”我自己知道我在哪里,但很多人都不会。
vsync

4
将其添加到要设置动画的元素的父级。
mddw

7

添加null变换hacktranslateZ(0))时动画变慢的原因是每个null 3D变换都会创建一个新图层。当这些层太多时,由于浏览器需要向GPU发送大量纹理,渲染性能会受到影响。

该问题在2013年的苹果首页上被发现,该网页滥用了null转换黑客。参见http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/

OP也正确地注意到了他们评论中的解释:

使用3D加速时,移动少量大物体比移动许多小物品更有效,因为所有3D加速层都必须转移到GPU并返回。因此,即使GPU表现出色,许多对象的传输也可能会成为问题,因此使用GPU加速可能不值得。


6

有趣。我试过了中的一些选项about:flags,特别是这些选项:

所有页面上的GPU合成使用所有页面上的GPU加速合成,而不仅仅是包含GPU加速层的页面。

GPU加速绘图启用合成后,启用页面内容的GPU加速绘图。

GPU加速的Canvas 2D通过使用图形处理器单元(GPU)进行渲染,可在2D上下文中实现更高的canvas标签性能。

启用这些功能,尝试一下,并在启用复选框的情况下惨败(就像您所做的那样)。但是后来我注意到了另一个选择:

FPS计数器当硬件加速处于活动状态时,显示页面的实际帧速率,以每秒帧数 为单位

考虑到标志说明中的突出显示,我推测即使没有勾选复选框,我实际上也正在启用硬件加速,因为我看到打开了上述选项的FPS计数器!

TL; DR:最终,硬件加速是用户的偏爱;强制使用虚拟设备translateZ(0)将引入多余的处理开销,从而导致性能降低。


2
好吧,然后检查一下。我做了另一个测试。基本上与测试#1相同,但是这次我另外添加了-webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html,让盒子绕它们自己的轴旋转-这次,硬件加速版本更快!如果取消旋转,则硬件加速会降低动画的速度。
Timo

@valmar:您是否启用了fps计数器?在这个新示例中,无论我如何设置复选框,我都可以看到它,这意味着仍要强制执行硬件加速。我想您的问题可以归结为“为什么translateZ(0)比现在慢rotateZ(360deg)
ov

其实没有 translateZ(0)一直处于活动状态。实际上需要触发3d加速。rotateZ(360deg)只是另外添加了旋转动画。所以我要说的问题是:为什么3D硬件加速的动画rotateZ(360deg)比没有3D硬件平滑?
Timo'4

1
无法相信。没有硬件加速,沉重图像的旋转更快...
ProblemsOfSumit

0

在chrome中检查chrome:// flags。它说

“启用线程合成后,加速的CSS动画将在合成线程上运行。但是,即使没有合成器线程,使用加速的CSS动画也可能会提高性能。”


我在chrome:// flags上找不到该选项。如果您关闭该功能,那么硬件加速版是否比非加速版更快?
Timo

现在,此选项位于DevTools设置中
Dmitry Pashkevich 2013年

0

我的经验是,对于所有类型的图形,GPU通常都不会更快。对于非常“基本”的图形,它们可能会变慢。

如果旋转图像,可能会得到不同的结果-这就是GPU擅长的事情

还要考虑translateZ(0)是3维操作,而改变top或left是2维操作


最有可能是实施问题。只要您正确实现GPU,GPU的所有图形都将更快;)
scientiaesthete 2012年

1
translateZ(0)实际上只是“激活” 3D硬件加速而已。这是一个hack,但可以。添加该css属性时,选定的html元素以及所有子元素将由GPU(而非CPU)强制计算。
2012年

我不知道所有的低层实现细节。我在QT上也遇到过类似的问题-硬件加速会减慢速度。我不知道计算机在哪一点(或是否)意识到可以忽略translationZ(0),并且可以将转换处理为二维运动。(无透视图,无抗锯齿,每个像素无z + = 0)
骚扰

科学地讲,GPU并不是对所有图形进行数学运算更快,因为将命令和内存移至GPU和GPU内存需要花费CPU的精力。使努力变得有价值是一个复杂性的突破点。YMMV <此处是先前组装的手动优化器;)
toBByrer

对于实际的计算部分,GPU的速度要快得多。但是,当前可以使用的所有GPU在开始实际计算之前都具有非常繁重的设置阶段。对于“简单”内容,让CPU执行所有渲染可能比GPU设置+ GPU计算更快。实施良好的浏览器将自动做出正确的选择,任何随机内容作者都不可能做得更好。
Mikko Rantalainen 2014年

-2

我看到了两个演示,我想我知道您感到困惑的原因:

  1. 动画元素不要使用左侧或顶部来更改位置,请尝试使用-webkit-transform;。
  2. 所有的子元素都需要打开硬件加速,例如使用translateZ()或translate3D;
  3. FPS衡量动画的流畅程度,您的演示FPS平均只有20FPS。

以上,仅是个人观点,谢谢!


欢迎使用Stack Overflow!请不要在帖子中使用签名/标语。您的用户名将被视为您的签名,并且您可以使用个人资料发布自己喜欢的任何信息。签名/标语常见问题解答
Andrew Barber

3
我已经解释了原因,并且在我链接到的FAQ条目中也提到了原因。您已经有一个签名-在右边查看,其中显示您的姓名和头像图片。
Andrew Barber 2013年

好吧,你“淫”了不过还是很感谢,还不太熟悉“计算器”的规则。
一丝冰凉

1
别客气。另请注意,这是仅英文网站。:)您的名字很好,但是您的帖子应该用英语完成。
Andrew Barber 2013年

3
苦逼了,我不会说英语,请原谅我。
一丝冰凉2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.