- 在布局文件中的背景遮挡的情况下,避免绘制DecorView的背景(有别于Activity的背景),减少过度绘制。
android:windowBackground属性就是DecorView的背景
- 将Activity的背景放到DecorView的背景中(虽然性能优化不大,但是能把平滑的感知提供给用户)
- 离屏缓冲开启硬件层(API 14后默认开启)
view.setLayerType(View.LAYER_TPYE_HARDWARE, null)
- 在动画启动前,开启硬件层,在动画结束时,立即关闭它,以释放被占用的显存,以用来提高动画性能,减少非必要计算
- 扁平化视图层级
- 对背景图片谁用9-patches图片,可一定程度上减少过度绘制,因为Android系统针对9-patches图片做了优化。
- 一定情况下,用GridLayout代替LinearLayout或者RelativeLayout,一般情况下,RelativeLayout可以最大化减少布局层级,相同的布局效果,LinearLayout也许用了2层布局,RelativeLayout用一层即可,但是LinearLayout效率是大于RelativeLayout的。GridLayout某些情况可以实现LinearLayout的效果。而且它由于是表格布局,1层布局层级实现相同的效果。
- <include/>标签重用布局文件
- <merge/>标签减少布局冗余,相当于直接将<merge/>标签里的内容直接插到目标布局中,不产生多层布局。
- ViewStup延迟加载,缩短首次加载时间,减少GPU,CPU使用,减少内存分配
- ListView和RecyclerView使用ViewHolder模式重用View避免频繁调用findViewById()消耗大量计算。
ListVIew中经常会出现别名冲突的情况,如下
- 为ImageView对象设置一个适当的尺寸,避免引起内存泄漏。常用手段是压缩Bitmap。
- 自定义View中避免不必要的重绘(invalidate()这些)
- 对每个View进行适当的裁剪,只绘制可见的一部分,必要时候为了提升用户体验可以缓冲即将入屏的那部分View,以避免非必要的过度绘制。
- xml布局的图形化Design窗口可以查看视图的层级,减少视图嵌套的深度。(开发初期阶段)
- Monitor中的Hierarchy Viewer对分析视图层级,调试UI界面,布局文件,查看绘制时间有的巨大的作用(当前SDK下Monitor逐渐被Android Profiler取代,Monitor可以0在{SDK根目录}\tools\lib\monitor-x86_64找到)
- Android设备开发者模式中调试GPU过度绘制,可以打开根据不同的色块查看过度绘制的次数(注意关闭护眼模式,或者色温调到标准)
真彩色(0次)<蓝色(1次)<绿色(2次)<粉色(3次)<红色(4次及以上)
- Android设备GPU呈现模式分析,可以在设备屏幕直接查看渲染不同阶段所花费的时间。以蓝紫红橙四个色段的长条显示不同处理阶段,以及他们用的时间比
蓝:绘制时间,一般指onDraw,当然还有别的,
紫:准备时间
红:处理OpenGL的时间
橙:CPU等待GPU完成工作所花费的时间
- adb shell dumbsys命令,用于查看所有程序操作,内存使用情况,以及每个渲染操作花费的确切时间。以数值形式返回,它更像一个log。API 23之后,dumbsys的新特性framestats会在前面的基础上列出了帧渲染过程中每个信息步骤所消费的时间。
framestats特性中的IntentedVsysnc和Vsync如果不一样可说明帧发生了丢失(伴随的卡顿的产生)
- Systrace分析渲染的各种信息,graphics,input,View System,WebView,Window Manager,Activity Manager等等
Trace.beginSection("Section Name");
try{
//要分析的代码
}finally{
Trace.endSection();
}