在css3实验中,我将10000个小div元素从浏览器视口的顶部移动到底部.对于这个测试,我使用了两种不同的方法:

  1. 使用translate3D(x, y, z)translateZ(0)的GPU加速
  2. 通过简单地调整CSS中的top属性,不会实现GPU加速

使用NO个硬件加速在Google Chrome上运行相当流畅.

如果启用硬件加速,性能会变得更差.太糟糕了,盒子甚至都没有均匀分布:

借助GPU/硬件加速:



没有GPU/硬件加速:



问题

为甚麽会这样呢?使用GPU不应该提高性能吗?

演示应用程序

https://www.timo-ernst.net/misc/hwtest/

来源

https://github.com/valnub/hwtest

我的硬件用于测试

  • Apple Macbook Pro 15英寸2015机型
  • CPU 2.8 GHz Intel Core i7
  • 16GB内存
  • MacOS Big Sur 11.2

100 (2014-11-13): Since this question is still attracting attention I'd like to point out that the problem itself still seems to exist although the mentioned stuttering might not be visible anymore in the provided demo 101. Older devices might still see performance issues.

*Update II(2021-02-17):问题仍然存在,但您必须根据使用的硬件增加演示中移动的盒子数量.我更改了演示应用程序的UI,这样你现在就可以调整移动的框的数量,为你的特定硬件创建一个口吃的动画.为了复制这个问题,我建议创建足够多的框,以便在启用GPU/硬件加速的情况下看到口吃.然后勾选方框,在不加速的情况下再次运行测试.动画应该更平滑.

推荐答案

添加null transform hack(translateZ(0))时动画速度较慢的原因是,每个空3D变换都会创建一个新层.当这些层太多时,渲染性能会受到影响,因为浏览器需要向GPU发送大量纹理.

这个问题是在2013年苹果主页上注意到的,苹果公司滥用了Null Transform黑客攻击.见http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/

OP也正确地注意到了their comment中的解释:

在使用3D加速时,移动几个大对象比移动许多小项目性能更好,因为所有3D加速的层都必须传输到GPU并往回传输.因此,即使GPU做得很好,许多对象的传输也可能是一个问题,因此使用GPU加速可能不值得.

Css相关问答推荐

搜索栏突出显示角形HTML中的Mat-Form-field输入框的焦点

CSS子网格不显示行间距

使用高图的背景大小渐变

如何使背景出现在具有自己背景 colored颜色 的子元素上

没有字母间距的CSS悬停边框

flex-wrap 导致 children 身高加倍

如果中间元素的内容不适合 CSS,如何将其分隔到新行?

如何在真实文本旁边制作文本阴影,使其看起来像 css 中的重复文本?

我无法在 next.js 应用程序中传播 daisyui 的主题

CSS 在具有多个背景图像的元素上过滤一个背景图像

如何在 CSS 中更改 ::marker SVG colored颜色 ?

仅对父容器应用模糊效果

CSS - 等高列?

选中时从 HTML 文本输入中移除蓝色光晕

如何在 Chrome 中模拟偏好 colored颜色 方案媒体查询?

在 css 中使用 FontAwesome 或 Glyphicons :before

最大宽度与最小宽度

CSS 悬停与 JavaScript 鼠标悬停

为什么浏览器会为 CSS 属性创建供应商前缀?

以不同的方式设置表格的第一个 列