原文:How much Skia GPU can accelerate WebKit rendering on Android

http://www.dorothybrowser.com/41/

翻译:农步祥

背景介绍: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

android渲染是skia与egl,Huang_Dongsung相关推荐

  1. android渲染是skia与egl,opengl和skia哪个快 游戏电脑问题解决分享!

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

  2. 「Android渲染」图像是怎样显示到屏幕上的?

    我们每天花很多时间盯着手机屏幕,不知道你有没有好奇过: 手机屏幕上的这些东西是怎么显示出来的? 这时候来了一位Android程序员(当然也可以是iOS或者是前端程序员)说: 这里显示的其实是一个Vie ...

  3. Android渲染机制和丢帧分析

    http://blog.csdn.net/bd_zengxinxin/article/details/52525781 自己编写App的时候,有时会感觉界面卡顿,尤其是自定义View的时候,大多数是因 ...

  4. Android NDK 使用skia

    Android NDK 使用skia 画图及显示图片的例子 分类: Android skia 2013-05-07 22:31  170人阅读  评论(2)  收藏  举报 skia NDK Andr ...

  5. Android UI优化—从Android渲染原理理解UI卡顿

    Android渲染机制 1.Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染 2.渲染的过程是由CPU与GPU协作完成 如下图: 为什么是16ms? 1.人眼与大脑之间的协作无法感 ...

  6. 【OpenGL】Android 中的 skia 和 OpenGL ES

    Android Graphic : apk and Skia/OpenGL|ES Android apk 里面的画图分为2D和3D两种:2D是由Skia 来实现的,也就是我们在框架图上看到的SGL,S ...

  7. android 渲染yuv数据,Android opengl渲染yuv420例子

    [实例简介] Android下使用OpenGL渲染yuv420p图像并显示.例子中提供了两种类型,一种使用GLSurfaceView在onDrawframe中调用native方法绘制,另外一种使用EG ...

  8. Android渲染--重温硬件加速上

    Android中绘图的API很多,比如2D的基于Skia的接口,3D的绘图OpenGLES,Vulkan等.Android早期系统多数都是采用2D的绘图模式,比如绘制一张Bitmap图片.随着用户对视 ...

  9. 内存中Android,什么是Android内存转储中的EGL和GL mtrack?

    我正在研究一个混合应用程序,它正在展现一些我正在尝试调试的特殊内存使用.一旦应用程序启动,它似乎立即使用接近250MB的内存,这似乎过分,因为我们在这一点上加载的是登录屏幕.我一直在看一些 Andro ...

最新文章

  1. 十大机器智能新型芯片:华为抢占一席,Google占比最多
  2. shell、javascript、python、tcl 等常用脚本语言
  3. 鑿婂瓙鏇版祴璇曡崏绋縶29C28FD771BA4B0D8693}
  4. 【无标题】RestHighLevelClient工具类
  5. 第五章:Java_面向对象编程(三)
  6. 数学 FZU 2074 Number of methods
  7. React开发(133):ant design学习指南之form中input加前缀
  8. 前端学习(498):水平居中布局得第一种方式
  9. Java缓存Ehcache-核心类和方法介绍及代码实例
  10. jQuery.Validate验证库 2
  11. 鲲鹏迁移第一批吃螃蟹的人,践行技术国际化
  12. C语言预定义宏的使用
  13. aws rds监控慢sql_如何使用Web控制台和AWS CLI停止AWS RDS SQL Server
  14. Managing Configuration Data Programmatically in ASP.NET 2.0
  15. Laravel框架--路由
  16. NVIDIA GeForce Experience 无法登录解决办法
  17. nodepad++之jsonviewer插件
  18. 长沙立坤文化怎么样?是骗子公司吗?网友想知道!
  19. 蚂蚁借呗总利息计算——每月等额(等额本息)
  20. 服务器ftp文件不能共享文件夹权限,ftp服务器共享文件夹权限设置

热门文章

  1. 乐山计算机学校新歌王,星歌王第二季乐山市计算机学校专场赛决赛完美落幕!...
  2. Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)
  3. Halcon PDF文档(extension_package_programmers_manual)学习总结
  4. Halcon 例程学习之频域自相关变换( correlation_fft)
  5. 磁盘及网络测试工具(iperf hdparm dd)
  6. ×××的虚拟专用网--gre
  7. 我的云之旅--hadoop单机设置(2)
  8. cisco hsrp备份小实验
  9. double write buffer
  10. ip 地址 192.168.1.255 代表( )。_如何批量ping大量ip地址?一个软件搞定