zoukankan      html  css  js  c++  java
  • [置顶] 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加快绘图速度。

     


     

    演讲中演示了一个例子,上图的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)。
  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3089337.html
Copyright © 2011-2022 走看看