Skia GPU加速能使Android系统的Webkit渲染获得多少收益?
Huang_Dongsung 农步祥 于 2013.03.31 23:45:49 | 源自:dorothybrowser.com | 版权:编译 | 平均/总评分:09.71/68
    • 背景介绍:Skia是一个2D图形显示引擎,2005年被谷歌收购,Skia也成为了Android系统的2D渲染显示核心。谷歌在官方网站明确说明Android并不支持所有2D特性的GPU加速。这篇文章的作者就针对Skia进行一些测试以验证其对GPU加速的支持程度。
      在Android的系统设置 - 调试选项中,有一个“强制进行GPU渲染”选项,为何用户打开后并不会得到预期的效果,还容易导致系统不稳定?为什么Android系统的流畅性更依赖处理器性能?这篇文章能从技术角度带来一些参考。

    GPU加速Webkit渲染有何意义?

    从Honeycomb[3.x]版本起,Andorid便支持GPU加速,但目前Android并没有使用Skia GPU进行Webkit渲染。Skia GPU使用OpenGL进行后台加速渲染,未来也许会代替Skia。

    很多人觉得,即使Android成功使用了GPU加速Webkit渲染,在访问浏览如雅虎等一般的网站时,用户也感觉不到太大的差异。因为Webkit的资源大多数消耗在了Javascript脚本和布局定位上。

    我们觉得Webkit使用GPU加速渲染的最大意义无非是HTML5 Canvas[HTML5的动态绘图效果]。Android渲染Canvas动画实在太慢,导致Web开发者根本无法在Android上用Canvas开发网页游戏[要注意的是,目前很多手机和平板的应用程序以HTML5做为界面,并使用Webkit工作,这也是很多应用在Android系统上感觉“不流畅”的重要因素。译者注]。

    Android Webkit开发平台[NDK]使用Skia GPU加速测试

    我们对Android系统使用Skia GPU加速的Webkit进行了测试。我们手上已经有Android Webkit NDK的WAC2.0版本,我使用了某个提交版本的Skia源码,并开启Skia GPU加速将其编译进NDK中。

    我并没有使用Canvas加速,因为这还要增加修改GraphicsContextSkia API的工作,所以并未测试Canvas渲染的性能。

    为了使用Skia GPU加速,我做了以下两点:

    • 1,新增了一个使用GLSurfaceView的eglContext内容。
      2,在WebView.cpp中使用SkGpuCanvas代替SkCanvas。

    我在系统版本为2.3.2的Nexus S上测试,并禁用了屏幕合成加速和Webkit后备缓存,结果出乎意料,Skia GPU反而降低了绘图性能,比Skia使用CPU渲染的时候慢了两倍以上。

  • 当用户滚动雅虎网站页面的时候,每一帧都会使Webkit对页面元素进行重绘。页面元素包括70%的文本,15%的矩形和15%的图像,Skia GPU“加速”渲染时候反而慢了五倍。

  • 你看到图表后也许会觉得Skia GPU渲染SVG动画时是要比CPU快那么一丁点了。不过Webkit在渲染SVG动画的时候出了一些问题,它绝大多数时间花在了定位布局SVG元素上,而不是渲染SVG元素。所以我不敢确定Skia使用GPU加速时是不是真的变快了。

  • Skia在栅格化文本的时候使用的是CPU而不是GPU,它将文本缓存为材质贴图。因此Skia GPU加速并不会增加滚动文本时的速度。

  • 我一开始觉得Skia GPU加速会在绘制飞舞的浏览器图标时理应能速度更快了,毕竟那是位图动画,是GPU的强项。结果,Skia GPU渲染慢了10倍……由于还没有得到详细结果,所以我们需要做进一步的研究,以找到问题的原因。

    当你构建Skia的时候,你会得到一个跑分程序,运行之后,你会看到使用CPU和GPU渲染时的性能差异。下面是一些测试得分中的重点项目。

    The test environment.

    Ubuntu 11.04

    Intel Xeon CPU X5650 2.67GHz 6Core L2 Cache 12MB

    Memory 12GB

    NVIDIA Quadro 4000

    CPU (msec)

    GPU (msec)

    bitmap_8888_A

    4.15

    1.47

    path_stroke_small_long_curved

    72.97

    98.96

    path_fill_small_long_curved

    23.53

    54.07

    path_stroke_small_triangle

    7.68

    116.44

    path_fill_small_triangle

    2.64

    97.35

    text_48_pos

    8.12

    12.28

    你能看到,除了位图绘制,Skia GPU渲染慢了两倍左右。

    为什么Skia GPU渲染会更慢?

    在我使用gDEBugger[调试工具]和callgrind记录之后,发现了一些问题:

    • 1,glDrawSomething调用得太频繁;
      2,gl[图形链接库]状态被调整得过多;
      3,转换到FBO[Frame Buffer Objects]的次数太频繁。

    这一切的祸根就是glDrawSomething用得太多,在Webkit调用SkCanvas::drawSomething的时候,每次都是Skia调用glDraw,改变GL状态,并转换为FBO的动作重复。而且即使Skia解决了这三个问题,我也无法确定Skia GPU在绘制文本动画和小几何图形的时候能比CPU要快。因为实际上GPU在渲染1000个以上数量的小几何图形[小于10像素]的时候难以变得更迅速。而在这之前,Android开发人员就已经极大优化了线性渲染器。在Skia的跑分程序中也看出path_stroke_small_triangle要慢约15倍左右。

    Skia GPU加速的前景

    你也许会觉得在绘制2D矢量图形的时候,使用GPU是不可能加速的,但请不要太早下结论,我写了一个小程序来测试在使用GPU绘制贝赛尔曲线的时候能比CPU快多少。幸运的是,在Nexus S上测试的时候,Android的GPU绘制确实比CPU快了点。

  • 绘制100个大圆的动画,GPU渲染快了1.5倍。

  • 绘制1000个小圆的动画,GPU渲染速度和CPU接近。

    Skia GPU很慢,不过谷歌只花了一年去实现他,我认为谷歌可以像优化线性渲染器那样去优化它。如果是这样的话,我觉得Android用户也许在一两年内就能享受HTML5 Canvas的游戏了[当然,结果是因为现在ARM的处理器性能越来越好,Skia GPU大概也许就这样被遗忘了……译者注]。

    请评分
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    03
    自己只能消化一部分。。。数毛涉猎越来越屌了~~
    发表于2014.02.26 20:01:17
    21
    221.215.001.***
    221.215.001.***
    发表于2013.08.08 17:22:32
    20
    221.000.***.***
    221.000.***.***
    提供内容的网页APP普遍不流畅,就连微博、网易新闻等等国内大企业的APP应用都卡顿。这个问题确实很严重,不过目前安卓的桌面倒是已经非常流畅了。
    发表于2013.05.30 12:52:33
    18
    112.091.132.***
    112.091.132.***
    发表于2013.05.07 06:13:12
    17
    113.119.***.***
    113.119.***.***
    不知道4.2下Nexus 4测试结果会如何呢?
    发表于2013.04.05 13:51:47
    16
    发表于2013.04.03 08:38:02
    15
    03
    发表于2013.04.02 22:30:34
    14
    114.255.***.***
    114.255.***.***
    13
    03
    角度选的好啊
    发表于2013.04.01 22:23:28
    12
    123.123.***.***
    123.123.***.***

    此帖使用Lumia 820提交
    发表于2013.04.01 09:17:36
    10
    03

    此帖使用DROID RAZR提交
    发表于2013.04.01 06:50:59
    9
    03
    发表于2013.04.01 01:33:19
    8
    123.123.109.***
    123.123.109.***
    发表于2013.04.01 00:52:58
    7
    122.013.***.***
    122.013.***.***
    但是为什么安卓的机顶盒(播放机)在打开GPU加速之后是界面切换速度会有提升呢?我的是美如画A11
    发表于2013.04.01 00:14:42
    4
    03
    发表于2013.04.01 00:09:39
    3
    03
    第一次耶~
    发表于2013.04.01 00:03:02
    2
    提示
    本贴不可匿名回复,回复等级为:1 ,您现在正处在潜水状态
    回复
    验证码
    8728 为防止广告机贴垃圾,不得已而为之
    表情
    正文