New Graphics Improvement in Android 4.3

下一个版本的Android,姑且认为是4.3,图形性能会有哪些提升?Android团队的图形专家Chet Haase和Romain Guy在Google IO 2013的演讲Android Graphics Performance上为我们透露了部分信息,演讲的内容包括架构性能提升,性能分析工具的改善和应用优化的一些建议,本文根据演讲内容写成,希望对做Android图形性能研究的朋友有所帮助。

参考链接

Android Graphics Performance – YouTube:
Android Graphics Performance – Slides:
Why your Android Apps Suck:
我的这篇文章对Android图形子系统做了一个基本分析,和对其架构做了对比和评价,可以作为后续内容的背景知识。
Android DisplayList 机制浅析:
这篇文章简单分析了Android DisplayList的机制。
如何使用systrace做性能分析:
介绍了性能分析工具systrace的使用。

架构性能提升

绘图指令重排和合并

Android 4.3会对UI界面的绘图指令进行重新排列并且对同类型的绘图指令进行合并,从而减少对GPU发出的glDrawXXX命令的个数和避免频繁改变GL绘图流水线的状态(比如切换不同的Shader等等),最大化利用GPU加快绘图速度。

p1

演讲中演示了一个例子,上图的UI界面包括两个Checkbox的Icon和文本,两个Button的9-patch背景和文本,如果只是按照界面本身的UI组件排列顺序,绘制的顺序应该是:

p2

1,绘制Checkbox Icon
2,绘制Checkbox文本“Include metadata”
3,绘制Checkbox Icon
4,绘制Checkbox文本“Maximize compatibility”
5,绘制Button的9-patch背景
6,绘制Button文本“Save”
7,绘制Button的9-patch背景
8,绘制Button文本“Cancel”

上面的绘制包括8个绘图指令和7次Shader的变化。

经过重新排序后,变成:

p3

1,绘制Checkbox Icon
2,绘制Checkbox Icon
3,绘制Button的9-patch背景
4,绘制Button的9-patch背景
5,绘制Checkbox文本“Include metadata”
6,绘制Checkbox文本“Maximize compatibility”
7,绘制Button文本“Save”
8,绘制Button文本“Cancel”

优化后的绘制包括8个绘图指令和2次Shader的变化。

经过合并后,变成:

p4

1,绘制两个Checkbox Icon
2,绘制两个Button的9-patch背景
3,绘制四个文本

进一步的优化后的绘制只需3个绘图指令和2次Shader的变化。

多线程绘制

 p5

首先要说明的是,Android GUI框架的线程架构并没有变,一样还是在主线程进行绘制(在主线程绘制而不是单独的渲染线程的弊端可以参考我的文章Why your Android Apps Suck)。只是一些比较耗时的渲染,比如Shadow和Path Effect的生成,可以通过多线程并发加快速度而已,具体线程的数目跟CPU的核心数有关。

支持非矩形裁剪

p6

HW Canvas终于支持非矩形裁剪了,不过考虑到兼容性问题,估计也没人敢用……

开发者工具

p7

Overdraw显示其实4.2就已经有了,对了解自己的应用是否过度绘制的开发者来说还是相当有用,最理想的情况是没有任何Overdraw,每个区域的像素只需要一次绘制,蓝色代表一次Overdraw,这意味着蓝色区域的像素被绘制了两次,绿色是两次,红色是三次,深红色是四次。当然实际上一次或者两次Overdraw很难完全避免,特别是界面包含一些复杂组合和半透明混合的效果,不过开发者可以通过这些信息来分析哪些Overdraw实际上是可以避免的,最后的优化建议环节Chet Haase和Romain Guy也通过一个实际的例子来演示一个应用如何对Overdraw进行优化。

p8

gfxinfo可以输出最近120帧绘制的耗时信息,其中Draw表示DisplayList生成的耗时,Process表示DisplayList执行的耗时,Execute表示窗口swap buffers的耗时,新的版本支持直接显示这些信息在应用的窗口上,这样就更加方便了。

p10

systrace在新的版本支持直接启动,不需要事先到开发人员选项里面去设置,并且公开了Java API供开发者分析自己的方法(其实4.1和4.2的版本也可以调用非公开的API)。
Advertisements