性能优化笔记

三方面:Android的渲染机制,内存与GC,电量优化。

渲染优化
UI达到60fps需要再16ms内完成绘制
工具:打开手机里的开发者选项,选择Profile GPU Rendering,选中On screen as bars的选项。
1,层叠组件来实现复杂的UI效果,可能造成过度绘制,canvas.clipRect指定绘制区域
2,减少布局嵌套,推荐使用constraintLayout, 约束集 LinearLayout(线性布局),RelativeLayout(相对布局),百分比布局等的功能于一身,扁平式的布局方式,无任何嵌套,减少布局的层级,优化渲染性能。使用merge,viewSub

Refresh Rate:代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。
Frame Rate:代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。
GPU会获取图形数据进行渲染,然后硬件负责把渲染后的内容呈现到屏幕上,他们两者不停的进行协作。

绘制流程 :Android需要把XML布局文件转换成GPU能够识别并绘制的对象。这个操作是在DisplayList的帮助下完成的。DisplayList持有所有将要交给GPU绘制到屏幕上的数据信息。任何时候View中的绘制内容发生变化时,都会重新执行创建DisplayList,渲染DisplayList,更新到屏幕上等一系列操作。

RecyclerView的尺寸在每次改变时,比如你加任何些东西。setHasFixedSize 的作用就是确保尺寸是通过用户输入从而确保RecyclerView的尺寸是一个常数。RecyclerView 的Item宽或者高不会变。每一个Item添加或者删除都不会变。如果你没有设置setHasFixedSized没有设置的代价将会是非常昂贵的。因为RecyclerView会需要而外计算每个item的size
 控件:
1 对于自定义控件,我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。
2 、避免嵌套太多层控件
3 、合理使用include、merge

布局优化
标签:    incloud
              如果被包含的布局也指定了id,以incloud的id为准,有layout_width和layout_heights属性。
              Merge
              直接继承父布局的布局,去掉多余的布局。
              viewSub
指定一个布局layout
              按需加载,setVisibility()或.inflate
绘制优化:
       onDraw()中不要创建新的对象,这个方法可能频繁调用,不要做耗时操作也不能执行成千上万次的循环操作。
      
内存和GC
1、 android的GC机制:Android里面是一个三级Generation的内存模型,最近分配的对象会存放在Young Generation区域,当这个对象在这个区域停留的时间达到一定程度,它会被移动到Old Generation,最后到Permanent Generation区域。
2 、执行GC操作的时候,任何线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。
3、Android系统里面有一个 Generational Heap Memory 的模型,系统会根据内存中不同的内存数据类型分别执行不同的GC操作。例如,最近刚分配的对象会放在Young Generation区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收的,同时这个区域的GC操作速度也是比Old Generation区域的GC操作速度更快的。

  • 局部变量的基本数据类型和引用,存储于栈中,引用的对象实体存储于堆中。因为它们属于方法中的变量,生命周期随方法而结束。
  • 成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体),因为它们属于类,类对象终究是要被new出来使用的。
  • 我们所说的内存泄露,只针对堆内存,他们存放的就是引用指向的对象实体。


导致频繁GC的原因:内存抖动的原因是大量的对象在短时间创建又被销毁
AS中的Device Monitor工具:
Allocation Tracker来查看在短时间内,同一个栈中不断进出的相同对象。这是内存抖动的典型信号之一

Heap Viewer,手动GC还在增长的说明有内存泄漏的可能,
TraceView,能找到频繁被调用的方法,也能找到执行非常耗时的方法,前者可能会造成Cpu频繁调用,手机发烫的问题,后者就是卡顿的问题

电量:
  • 某些非必须马上执行的操作,例如上传歌曲,图片处理等,可以等到设备处于充电状态或者电量充足的时候才进行。

消耗电量的几个主要原因、功能:
1、大数据量的网络传输(网络)
2、不停的网络切换(网络)
3、解析大量的数据(CPU)
 
网络方面的优化:
1 、网络请求之前,检查网络连接。没有网络连接不进行请求 2 判断网络类型,针对特定的数据在特定的网络下请求。例如:大量数据传输的时候,在wifi下请求。wifi下下载数据耗电量只有2、3、4G的1/3.
4、使用GZIP压缩方式下载数据,能减少网络流量,缩短下载时间
5 、合理使用缓存,避免重复操作
8、是JobScheduler API所做的事情。它会根据当前的情况与任务,组合出理想的唤醒时间,例如等到正在充电或者连接到WiFi的时候,或者集中任务一起执行。我们可以通过这个API实现很多免费的调度算法。
 

1不要过多使用枚举,枚举占用的内存空间比整型大
2常量使用static final修饰
3使用安卓特有的数据结构,sparseArray(替代hashMap,节省存储空间,折半查找法提高4效率)和pair
4使用软引用或弱引用
5采用内存缓存和磁盘缓存
6内部类加静态

变量常量集合,都应该在destory中释放掉(集合clear,常量赋值为空

adapter中没有使用ViewHolder复用,会每次都去findViewById层层 查找控件

没有复用convertView,为空加载布局,不为空复用,永远只加载屏幕可显示条目数加一的布局数量。


猜你喜欢

转载自blog.csdn.net/m0_38058826/article/details/80844144
今日推荐