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

参考链接

Android Graphics Performance – YouTube: http://www.youtube.com/watch?v=vQZFaec9NpA Android Graphics Performance – Slides: http://www.curious-creature.org/2013/05/17/android-sessions-at-google-io-2013/ Why your Android Apps Suck: http://rogeryi.wordpress.com/2013/03/26/why-your-android-apps-suck/ 我的这篇文章对Android图形子系统做了一个基本分析,和对其架构做了对比和评价,可以作为后续内容的背景知识。 Android DisplayList 机制浅析: http://rogeryi.wordpress.com/2012/11/19/android-displaylist-introductio/ 这篇文章简单分析了Android DisplayList的机制。 如何使用systrace做性能分析: http://rogeryi.wordpress.com/2012/11/30/android-systrace-in-4_1/ 介绍了性能分析工具systrace的使用。

架构性能提升

绘图指令重排和合并

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


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


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的变化。

经过重新排序后,变成:


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的变化。

经过合并后,变成:


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

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

多线程绘制




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

支持非矩形裁剪



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

开发者工具



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


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


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

更多相关文章

  1. Android(安卓)自定义View(一)原理
  2. Android移动图片
  3. Android(安卓)EditView属性详细介绍
  4. Android(安卓)vector矢量图应用实例
  5. Android(安卓)BitmapShader 实战 实现圆形、圆角图片
  6. Android移植的Box2D
  7. android对html支持接口总结
  8. GridView或ListView 中android:drawSelectorOnTop的用法
  9. Android(安卓)Native 绘图方法

随机推荐

  1. android 横屏重启的解决方案
  2. Android四大基本组件介绍与生命周期
  3. android之ListView和SimpleAdapter的组合
  4. Android(安卓)强制设置横屏或竖屏 设置全
  5. 系出名门Android(7) - 控件(View)
  6. Android(安卓)Dialog的使用
  7. android各种提示Dialog 弹出框
  8. android语音搜索结果显示页实现
  9. Android用ViewPager实现多页面的切换效果
  10. ActionBar的自定义样式