@ZeroGeek
2018-07-25T09:53:38.000000Z
字数 1216
阅读 677
Android性能优化
Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源,找出界面滑动不流畅、界面启动速度慢、手机发热。
如何查看过度绘制?
设置 — 开发中选项 — 调试GPU过度绘制
原色:没有过度绘制
紫色:1 次过度绘制
绿色:2 次过度绘制
粉色:3 次过度绘制
红色:4 次及以上过度绘制
总结一下,优化步骤如下:
1、移除或修改Window默认的Background
2、移除XML布局文件中非必需的Background
3、按需显示占位背景图片
4、控制绘制区域
布局太过复杂,层级嵌套太深导致绘制操作耗时,且增加内存的消耗。
目标就是,层级扁平化。
布局优化的建议:
第一个建议:可以使用相对布局减少层级的就使用相对布局,否则使用线性布局。
第二个建议:用merge标签来合并布局,这可以减少布局层次。
第三个建议:用include标签来重用布局,抽取通用的布局可以让布局的逻辑更清晰明了,但要避免include乱用。
第四个建议:避免创建不必要的布局层级。(最容易发生的!)
第五个建议:使用惰性控件ViewStub实现布局动态加载(注意:使用ViewStub加载的布局中不能使用merge标签)
工具:
Hierarchy Viewer(DDMS中)
https://blog.csdn.net/gjy211/article/details/52624788
GPU呈现模式分析(大致定位问题)
开发者选项 — GPU呈现模式分析 — 选择“在屏幕上显示为条形图”
工具:
GPU monitor
StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具。最常用的场景就是检测主线程中本地磁盘和网络读写等耗时的操作。
什么时候使用ArrayMap呢?(而不用HashMap)
1、对象个数的数量级最好是千以内,没有频繁的插入删除操作
2、数据组织形式包含Map结构
为了避免Autoboxing行为Android提供了SparseArray,此容器使用于key为int类型。
SparseBooleanMap,SparseIntMap,SparseLongMap等容器,是key为int,value类型相应为boolean、int、long等。
避免使用枚举类型
工具:
Memory monitor
LeakCanary
MAT(Memory Analyzer Tool
GT(应该更适合测试同学测试APP性能)