资讯 人工智能开发者
此为临时链接,仅用于文章预览,将在时失效

一篇文章为你详解什么是 GPU 加速

作者:AI研习社
2017/04/12 11:33

雷锋网按:本文作者 被单,原载于 凹凸实验室,雷锋网获授权转载。

一篇文章为你详解什么是 GPU 加速

众所周知,网页不仅应该被快速加载,同时还应该流畅运行,比如快速响应的交互,如丝般顺滑的动画……

一. GPU 加速能做什么?

首先我们要了解什么是 16ms 优化

一篇文章为你详解什么是 GPU 加速

1. JavaScript:JavaScript 实现动画效果,DOM 元素操作等。

2. Style(计算样式):确定每个 DOM 元素应该应用什么 CSS 规则。

3. Layout(布局):计算每个 DOM 元素在最终屏幕上显示的大小和位置。由于 web 页面的元素布局是相对的,所以其中任意一个元素的位置发生变化,都会联动的引起其他元素发生变化,这个过程叫 reflow。

4. Paint(绘制):在多个层上绘制 DOM 元素的的文字、颜色、图像、边框和阴影等。

5. Composite(渲染层合并):按照合理的顺序合并图层然后显示到屏幕上。

利用 GPU 加速优先使用渲染层合并属性,避免 layout,paint。

一篇文章为你详解什么是 GPU 加速

从上图可以看出,可以通过改变元素的 transform 实现移动,伸缩变换而非改变物体的 left,top,width,height 避免 layout,paint。让动画效果更加流畅。

一篇文章为你详解什么是 GPU 加速

优化

一篇文章为你详解什么是 GPU 加速

二. GPU 是什么,如何用 Chrome devtools 进行分析 debug?

浏览器渲染一个页面大致是按照下面这个步骤执行。

1. 获取 DOM 并将其分割为多个层(RenderLayer)

2. 将每个层栅格化,并独立的绘制进位图中

3. 将这些位图作为纹理上传至 GPU

4. 复合多个层来生成最终的屏幕图像(终极 layer )。

Chrome 开启查看 renderlayer

一篇文章为你详解什么是 GPU 加速

按上面的步骤之后,即可看到

一篇文章为你详解什么是 GPU 加速

1. 黄色边框:有动画 3d 变换的元素,表示放到了一个新的复合层(composited layer)中渲染

2. 蓝色的栅格:这些分块可以看作是比层更低一级的单位,这些区域就是 RenderLayer
打开一个页面,如果该页面的黄色边框很多,那么肯定要查看一下原因了

Chrome 查看 layer

一篇文章为你详解什么是 GPU 加速

根据这个优点,我们可以把页面中一些布局经常变换的dom(动画)提升到独立的层。那么,浏览器在之后的 16ms 中,只需进行下面的几个步骤。

一篇文章为你详解什么是 GPU 加速

三. 如何开启 GPU 加速?

目前下面这些因素都会引起Chrome创建合成层:

1. 3D 或透视变换(perspective,transform) CSS 属性

2. 使用加速视频解码的video元素

3. 拥有 3D (WebGL) 上下文或加速的 2D 上下文的 canvas 元素

4. 混合插件(如 Flash)

5. 对自己的 opacity 做 CSS 动画或使用一个动画 webkit 变换的元素

6. 拥有加速 CSS 过滤器的元素

7. 元素A有一个 z-index 比自己小的元素B,且元素B是一个合成层(换句话说就是该元素在复合层上面渲染),则元素A会提升为合成层。

上面7点都非常容易理解,在日常开发中,最容易出现问题的是第7点

四. GPU 加速隐藏的坑–隐式合成

拿实际项目举个栗子,我们按照上面的步骤开启 layer borders

一篇文章为你详解什么是 GPU 加速

尚未给上图右手添加高层级的 z-index 时,整个页面在移动端打开后闪退。而添加了 z-index 之后,页面正常显示,不闪退了。
仔细看上面的 gif ,仅仅改变了 z-index ,就会改变大批数量的层(黄色边框)

为什么 z-index 力量这么大?

我们来看一个栗子,B 在做动画,理所当然把B提到单独的合成层。减少重绘。

一篇文章为你详解什么是 GPU 加速

按照上图,我们遇到一个逻辑问题,元素B应该在单独的合成层上,并且屏幕的最终图像应该在 GPU 上组成。但是A元素在B元素的顶部,我们没有指定提升A元素自身层级的东西。那么浏览器会做什么?它将强制为元素A创建一个新的合成图层。
这样,A和B都被提升到单独的复合层。
因此,使用 GPU 加速提升动画性能时,最好给当前动画元素增加一个高一点的 z-index 属性,人为干扰复合层的排序,可以有效减少 Chrome 创建不必要的复合层,提升渲染性能。

注意:GPU 不仅需要发送渲染层图像到 GPU ,而且还需存储它们,以便稍后在动画中重用。别盲目创建渲染层,一定要分析其实际性能表现。因为创建渲染层是有代价的,每创建一个新的渲染层,就意味着新的内存分配和更复杂的层的管理。对于使用移动设备的用户来说是很坑的。移动设备没有台式机那么多的内存。过多的 GPU 加速会引起页面卡顿甚至闪退。

找到 layers,点击当前层,在右边查看占用的 memory(内存)

一篇文章为你详解什么是 GPU 加速一篇文章为你详解什么是 GPU 加速

总结

整篇文章介绍了下面几个部分

● GPU 加速能做什么

● GPU 是什么,如何用 Chrome devtools 进行分析 debug?

● 如何开启 GPU 加速?

● GPU 加速隐藏的坑–隐式合成

参考:

http://www.jianshu.com/p/a32b890c29b1 

http://div.io/topic/1348 

雷锋网相关阅读:

黄仁勋亲自撰文怼上 TPU:P40速度比你快 2 倍,带宽是你的 10 倍

谷歌硬件工程师揭秘,TPU为何会比CPU、GPU快30倍?

长按图片保存图片,分享给好友或朋友圈

一篇文章为你详解什么是 GPU 加速

扫码查看文章

正在生成分享图...

取消
相关文章