【问题标题】:Test if Hardware Acceleration has been enabled for a CSS animation?测试是否为 CSS 动画启用了硬件加速?
【发布时间】:2014-12-09 00:12:10
【问题描述】:

我如何告诉(用于测试目的)是否为 CSS 动画启用了硬件加速?

我有以下代码,它基本上放大了一个元素并使其全屏(不使用 HTML5 全屏 API)。当使用 jQuery 动画时,它在大多数手机上运行起来就像一只口吃的哮喘乌龟,所以我改用 CSS3。

这里是 jsFiddle 示例:

$("#makeFullscreen").on("click", function() {        
			
    var map = $("#map"),
        mapTop = map.offset().top,
        mapLeft = map.offset().left;
    
    $("#map").css({
        "position": "fixed",
        "top": mapTop,
        "left": mapLeft,
        "width": map.outerWidth(true),
        "height": map.outerHeight(true)
    });
    
    setTimeout(function(){map.addClass("fullscreen")},1);
    
    return false;        
});
.mapContainer {    
    width: 150px;
    height: 200px;
    position: relative;
    margin: 0 auto;
}

.map {  
    background: #00f;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    text-align: center;
}
.fullscreen {
    -webkit-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
    -moz-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
    -ms-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
    -o-transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
    transition: top 300ms ease-out, height 300ms ease-out, left 300ms ease-out, width 300ms ease-out;
    
    -webkit-transform: translate3d(0, 0, 0);
    -moz-transform: translate3d(0, 0, 0);
    -ms-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
    
    top: 0 !important;
    left: 0 !important;
	width: 100% !important;
	height: 100% !important;
}

#makeFullscreen {
    margin-top: 20px;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="mapContainer">
    <div id="map" class="map">
        <button id="makeFullscreen">Make Fullscreen</button> 
    </div>
</div>

这会添加一个类,并且元素会使用 CSS 转换从一个状态转换到下一个状态。这比 jQuery 快,但在 iOS 和 android 上仍然卡顿。

但我读到here,您可以通过指定基本上什么都不做的 3d 变换来强制使用 GPU 加速过渡,如下所示:

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

但是,在将它添加到我的 CSS 之后,我发现视觉效果没有任何改善。

那么问题...

有没有办法查看是否已通过任何浏览器中的开发工具启用硬件加速?我不需要用脚本来检测这个,我只是想知道用于测试目的。

【问题讨论】:

  • 你不能直接说。我见过人们做的唯一一件事就是运行某种性能测试来测试正在产生的性能。几年前,确实在某些浏览器中,让您的过渡到 3d 过渡可以触发更多的 GPU 支持 - 我不知道目前的情况如何。
  • @TachyonVortex 我不想使用代码来检测这一点并提供回退。我想知道是否有办法通过任何浏览器中的开发工具来做到这一点。我已经改变了我的问题以反映这一点,因为我认为这最初并不明确。
  • 我知道这条评论与问题无关,但我必须分享我使用翻译属性的经验。除非您真的需要,否则请不要使用它,因为在具有此属性的元素之后,渲染引擎正在创建一个新的流容器,因此例如,如果您想使用固定位置,它将被渲染为具有翻译的元素的相对位置财产。阅读此线程,stackoverflow.com/questions/2637058/…
  • @Ivica 您的评论具有误导性。虽然translate 在固定定位的情况下可能不是最好的,但对于其他定位的动画,它总是更好。 fixed 定位目前是例外,而不是标准。

标签: jquery css css-animations hardware-acceleration


【解决方案1】:

概述

如果满足所有这些条件,则元素上的 CSS 属性转换是硬件加速的:

  1. 在浏览器中启用了硬件加速层合成
  2. 正在转换的 CSS 属性是可加速的
  3. 元素被赋予了自己的合成层

一般来说,这些条件的要求是:

  1. 必须启用相关的硬件加速选项,并且不得将设备的 GPU 和图形驱动程序列入黑名单
  2. 只有合成 CSS 属性(opacitytransform: translate / scale / rotate 等)是可加速的
  3. 每个浏览器都有特定的理由来决定是否为元素提供自己的合成层(或者可以通过使用像 transform: translate3d 这样的“更快”黑客来强制)

硬件加速层合成

确定是否启用:

1。一般加速度

  • 转到chrome://settings
  • 点击+显示高级设置按钮
  • 系统部分,检查Use hardware acceleration when available复选框的状态

如果启用加速,则:

2。加速合成

  • 转到chrome://gpu
  • Graphics Feature Status 部分,检查 Compositing 的值。这将是以下之一:
    • 硬件加速
    • 仅软件,硬件加速不可用

更多关于软件合成器的细节来自docs

在某些情况下,硬件合成是不可行的,例如如果设备的图形 驱动程序是 blacklisted 或设备完全没有 GPU。对于这些情况是 GL 渲染器的替代实现称为 SoftwareRenderer

(注意:Chrome 也有一个Legacy Software Rendering Path,它“在 2014 年 5 月仍然存在,但很快将在 Blink 中完全删除。”)

这是一篇包含更多信息的精彩文章:Accelerated Rendering in Chrome

火狐

1。一般加速度

  • 转到 Firefox 的首选项
  • 转到高级标签
  • 转到常规子选项卡
  • 检查在可用时使用硬件加速复选框的状态

如果启用加速,则:

2。图层加速

  • 转到about:config
  • 搜索layers.acceleration.disabled

如果启用图层加速(如果值为false),则:

3。 GPU 加速窗口

  • 转到about:support
  • Graphics 部分,检查 GPU Accelerated Windows 的值

如果它不以0/ 开头,并且显示了渲染 API(例如 OpenGL、Direct3D),则 GPU 加速处于活动状态。

Safari

  • 通过在终端中运行以下命令启用 Safari 的调试菜单:
    defaults write com.apple.Safari IncludeInternalDebugMenu 1
  • 打开(或重新启动)Safari
  • 在 Safari 的 Debug 菜单中,检查 Drawing/Compositing Flags 子菜单中Disable Accelerated Compositing 选项的状态

可加速的 CSS 属性

唯一可以硬件加速的 CSS 属性转换发生在渲染过程的合成阶段。例如:

为了充分受益于加速,必须转换非合成属性。例如:

  • 仅在 transform: translate 上进行转换即可获得加速的全部优势(因为 GPU 可以简单地重新组合元素层)。
  • transform: translatewidth 上的过渡将几乎没有任何好处从加速(因为 width 上的过渡会导致 CPU 为每个动画帧重新绘制元素的层)。

合成图层和彩色边框

浏览器的渲染引擎决定(基于用户偏好、CSS 样式等)是否为元素提供自己的合成层。

比如Chrome有this list of reasons,在chrome://flags也有这个选项:

为带有过渡的 RenderLayers 合成
启用此选项将使具有不透明度、变换或过滤器过渡的 RenderLayers 拥有自己的合成层。

如果一个元素没有被赋予它自己的层,那么该元素上的任何 CSS 过渡都不会被加速。

transform: translate3d (the "go faster" hack) 通常会强制为元素赋予其自己的层。

但是即使一个元素被赋予了自己的层,非合成属性上的转换(widthheightlefttop 等)仍然无法加速,因为它们发生在合成阶段之前(例如,在布局或绘画阶段)。 @ChrisSpittle 这就是为什么您在添加 transform: translate3d 后没有看到视觉改进的原因。

大多数浏览器可以在合成层周围显示彩色边框,以便于开发/调试时识别它们:

显示合成图层的边框可以通过以下两种方式之一完成:

  • 对于所有页面 — 转到 chrome://flags 并启用合成渲染层边框(“在合成渲染层周围渲染边框以帮助调试和研究图层合成”)。您需要重新启动 Chrome 才能使其生效。
  • 对于单个页面 - 打开开发者工具,然后打开抽屉,选择渲染选项卡,然后启用显示合成图层边框。现在,在任何页面上打开开发者工具都会导致图层边框显示在该页面上。

现在触发元素上的 CSS 过渡。如果它有彩色边框,那么它就有自己的合成层。

边框颜色及其含义在debug_colors.cc 中定义。更多详情 herehere

火狐

绘制合成图层的边框:

  • 转到about:config
  • 搜索layers.draw-borders并启用它

现在触发元素上的 CSS 过渡。如果它有彩色边框,那么它就有自己的合成层。

边框颜色及其含义在Compositor::DrawDiagnosticsInternal中定义。

Safari

(这对我来说不适用于 Safari 7.0.3,但它似乎对某些人有用 as recently as last year。)

从终端启动 Safari,并设置 CA_COLOR_OPAQUE 布尔环境变量:

$ CA_COLOR_OPAQUE=1 /Applications/Safari.app/Contents/MacOS/Safari

替代方法:

$ export CA_COLOR_OPAQUE=1 
$ /Applications/Safari.app/Contents/MacOS/Safari

显然,硬件加速层应该是红色的。更多详情herehere

更新:

这是在 Safari 7.0.3 中适用于我的另一种方法(感谢 David Calhoun):

  • 在 Safari 的 Debug 菜单中,在 Drawing/Compositing Flags 子菜单中启用 Show Compositing Borders

现在触发元素上的 CSS 过渡。如果它有彩色边框,那么它就有自己的合成层。


参考文献

有关更多详细信息,请查看以下优秀文章:

【讨论】:

  • 这正是我所追求的。感谢您提供详细的信息和出色的答案。
  • 惊人的答案,这仍然有帮助!
  • transform: scale(1.5) translate(10px 10px) 不会加速吗?
猜你喜欢
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多