zoukankan      html  css  js  c++  java
  • 读书笔记:关于android性能优化


    1)首先,解释一下设备上画面卡顿的原因。
    人眼观察所感觉的流畅画面,需要的帧数是40到60每秒。在android中,系统通过VSYNC信号触发对UI的渲染,重绘。间隔时间是16ms。也就对应着60帧每秒的绘制速度。如果绘制间隔是16MS之内,那么我们看到的画面将会是非常流畅的。这就要求我们将所有程序的逻辑保持在16MS以内。否则,就会造成丢帧,造成卡顿。(如果一次绘制任务在20MS,那么在16ms系统发出VSYNC信号时就无法绘制,那么就在16MS*2的时间内都是显示的同一帧画面,这就是造成卡顿的原因)。
    Android系统提供了检测UI渲染时间的工具,打开"开发者选项"->"GPU呈现模式分析"->"在屏幕上显示为条形图",就能看到如下图形;中间的绿线,表示16MS的界限,每一条柱状图表示这一次绘制所需时间。所以需要尽量将所有的条形图都控制在绿线以下。

     

    另外,开发者选项中另一个"调试GPU过度绘制",可以查看当前区域中的绘制次数,从而优化绘图层次,颜色越深,表示绘制次数越多,反之则越少。应该尽量让绘制次数减少,即深色区域减少,浅色区域增多。

    2)优化布局层级:
    1、系统对view进行测量,布局和绘制时,都是通过view树的遍历(androidstudio中xml布局文件有一个设计视图,能看到当前的view树结构),如果一个树太高,就会严重影响布局,测量和绘制的速度,因此应该尽量降低树高度。
    2、AndroidStudio中现在如果你去新建一个Layout.xml,系统提供的默认的布局是RelativeLayout,其实以前是LinearLayout,这是因为谷歌也在推荐使用相对布局作为默认布局,以减少view树的高度,提高UI渲染效率。
    3、避免嵌套太多无用布局
    布局嵌套会让view树变得越来越高,因此应该根据布局特点,选择不同的Layout,从而避免使用同一种Layout组件来实现功能时的局限性。

    3)使用<include>标签来重用Layout;
    应用中可能有多个地方需要用到同一个UI布局。如果是使用<include>重用了某一个XML布局,那么引用的这个部分里面的子组件, 可以直接通过findViewById的方式获得.并且进行操作。这段include代码,相当于,在原来的XML布局文件中增加了一段完整的Layout代码。
    如图:
    这是common.xml


    这是主Main.xml


    在activity中可以直接这样:

    就能达到简化代码写法的目的,增加代码可读性,可维护性。

    4)ViewStub组件:实现组件延迟加载;
    如果某些组件在布局初始化的时候不需要显示,那么可以使用这个组件进行延迟加载,等需要使用的时候再去渲染。这样就能加快界面初始化的速度。(必须注意:设置组件的visiable属性也能控制显示/隐藏,但是并不能减少初始化时的资源消耗,虽然设置了visiable=GONE,但是依然会被初始化,消耗了系统资源,拖慢了加载速度)

    ViewStub的原理(个人理解):相当于把一部分组件给压缩并且隐藏,需要显示这些组件的时候,就对他们进行初始化并且展开显示。一旦显示出来,ViewStub就不存在了,被替换成了展开之后的那些组件。

    直接看代码:
    这是延迟加载的组件的layout:


    这是引用stub layout的主main.xml:


    java部分:

     

  • 相关阅读:
    day09 小练习 斐波那契数列 文件
    day09三目运算
    day08文件操作
    Nginx 内容缓存及常见参数配置
    阿里开源分布式事务解决方案 Fescar 全解析
    为什么你学不会递归?刷题几个月,告别递归,谈谈我的经验
    JavaScript 复杂判断的更优雅写法
    Java 线程本地 ThreadLocal 的分析和总结
    总结异步编程的六种方式
    JAVA8新特性(吐血整理)
  • 原文地址:https://www.cnblogs.com/hankzhouAndroid/p/6531261.html
Copyright © 2011-2022 走看看