Skia GPU加速能使Android系统的Webkit渲染获得多少收益

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Skia GPU加速能使Android系统的Webkit渲染获得多少收益相关的知识,希望对你有一定的参考价值。

  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渲染时的性能差异。下面是一些测试得分中的重点项目。
  你能看到,除了位图绘制,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个圆测试 -
使用CPU渲染

  相关资料收藏此图相关图片

  贝塞尔曲线绘制100个圆测试 -
使用GPU渲染

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

  相关资料收藏此图相关图片

  贝塞尔曲线绘制1000个圆测试 -
使用CPU渲染

  相关资料收藏此图相关图片

  贝塞尔曲线绘制1000个圆测试 -
使用GPU渲染

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

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

Android JB skia api/操作列表

【中文标题】Android JB skia api/操作列表【英文标题】:Android JB skia api/operation list 【发布时间】:2013-08-13 02:37:00 【问题描述】:

我注意到Android开发者官网有如下解释,

" 我们预计 Skia 将被慢慢淘汰,而不会对开发人员产生不利影响。 Skia 目前已被弃用并处于维护模式,但将需要一段时间,因为今天发布的大多数应用程序仍然依赖于非硬件加速的 Canvas 操作。另外,并不是所有的 Skia 操作都被 OpenGL 支持,所以一些操作仍然是用 Skia 软件完成的,即使打开了硬件加速。 "

是否有任何列表可以通过skia告诉我Android JB图形部分仍在使用哪些操作?

我相信任何参考资料都会对我有用。

提前致谢。

【问题讨论】:

【参考方案1】:

答案可在 Android 开发者网站上Hardware Acceleration 页面上的图表中找到。

有关更多背景信息,您可以观看有关硬件渲染的 Google IO 会话:

http://www.google.com/events/io/2011/sessions/accelerated-android-rendering.html

【讨论】:

感谢张先生的宝贵回答。 关于硬件加速,我可以使用链接中显示的表格吗,例如,在Canvas api中,drawPicture()只能通过skia实现,而OpenGL(API级别18)? Paint、Xfermode 和 Shader 也是如此。 我认为不支持 drawPicture()。您可能的意思是 drawBitMapMesh() 在 API 18 上具有硬件加速,这就是我的阅读方式。 在 API 18 中,硬件加速支持 drawBitMapMesg()。这意味着实现将走 OpenGL 路线。然而,由于硬件加速还不支持drawPicture(),它只能走skia route。另外,大部分 Paint(除了一些被选中)、Xfermode 和 Shader 尚不被硬件加速支持,因此它们只能通过skia lib 使用。我的理解正确吗? 老实说,我只是在阅读文档。如果您真的想知道发生了什么,您可以随时创建一个测试应用或查看源代码。

以上是关于Skia GPU加速能使Android系统的Webkit渲染获得多少收益的主要内容,如果未能解决你的问题,请参考以下文章

SkiaSharp 和 GPU 加速

Android JB skia api/操作列表

如何在通常的 iOS 应用程序(基于 UIWindow)中使用 GPU 加速的 SkCanvas?

浅析Flutter的架构设计

[OpengGL]渲染流程和程序流程

skia 将网页录制成 skp 文件 通过skia的dm或者其他方式重放