共计 2900 个字符,预计需要花费 8 分钟才能阅读完成。
前言
本文次要解说 Android 性能优化中的绘制优化
适度绘制的优化准则
- 尽可能地管制 适度绘制的次数 =
2
次(绿色)以下,蓝色最现实 - 尽可能防止 适度绘制的粉色 & 红色状况
- 不容许 3 次以上的
优化计划
- 移除默认的
Window
背景 - 移除 控件中不必要的背景
- 缩小布局文件的层级(嵌套)
- 自定义控件 View 优化:应用 clipRect()、quickReject()
优化计划 1:移除默认的 Window 背景
-
背景 个别应用程序 默认 继承的主题 =
windowBackground
,如默认的 Light 主题:<style name="Theme.Light"> <item name="isLightTheme">true</item> <item name="windowBackground">@drawable/screen\_background\_selector\_light</item> ... </style>
- 问题 个别状况下,该默认的 Window 背景根本用不上:因背景都自定义设置 若不移除,则导致所有界面都多 1 次绘制
-
解决方案 移除默认的 Window 背景
形式 1:在利用的主题中增加如下的一行属性 <item name="android:windowBackground">@android:color/transparent</item> <!-- 或者 --> <item name="android:windowBackground">@null</item> 形式 2:在 BaseActivity 的 onCreate() 办法中应用上面的代码移除 getWindow().setBackgroundDrawable(null); <!-- 或者 --> getWindow().setBackgroundDrawableResource(android.R.color.transparent);
优化计划 2:移除 控件中不必要的背景
如 2 个常见场景:
- 场景 1:
ListView
与Item
列表页(ListView)
与 其内子控件(Item)
的背景雷同 = 红色,故可移除子控件(Item)
布局中的背景
- 场景 2:
ViewPager
与Fragment
对于 1 个ViewPager
+ 多个Fragment
组成的首页界面,若每个Fragment
都设有背景色,即 ViewPager 则无必要设置,可移除
对于更多场景,可应用工具 Hierarchy View
查看,具体请看文章:?[过渡绘制的应用工具:Hierarchy View]()
优化计划 3:缩小布局文件的层级(缩小不必要的嵌套)
- 原理:缩小不必要的嵌套 ->> UI 层级少 ->> 适度绘制的可能性低
- 优化形式:应用布局标签
<merge>
& 适合抉择布局类型
优化计划 4:自定义控件 View 优化:应用 clipRect()、quickReject()
-
clipRect()
- 作用:给 Canvas 设置一个裁剪区域,只有在该区域内才会被绘制,区域之外的都不绘制
- 实例阐明:
DrawerLayout
布局 = 左抽屉布局
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTim
// ... 仅贴出要害代码
// 1. 遍历 DrawerLayout 的 child view,拿到抽屉布局
for (int i = 0; i < childCount; i++) {final View v = getChildAt(i);
if (v == child || v.getVisibility() != VISIBLE
|| !hasOpaqueBackground(v) || !isDrawerView(v)
|| v.getHeight() < height) {continue;}
// a. 若是左抽屉布局
// 则取抽屉布局的右边界作为裁剪区的左边界、设置原主布局的裁剪区域,如上图裁剪区域
if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) {final int vright = v.getRight();
if (vright > clipLeft) clipLeft = vright;
// b. 若是右抽屉布局
// 则取抽屉布局的左边界作为裁剪区的右边界、设置原主布局的裁剪区域
} else {final int vleft = v.getLeft();
if (vleft < clipRight) clipRight = vleft;
}
}
// 2. 通过 clipRect()设置原主布局的显示范畴 = 裁剪区域,使其仅在上图中的红框区域(即不妨碍抽屉布局的区域)显示
// 从而防止适度绘制
canvas.clipRect(clipLeft, 0, clipRight, getHeight());
}
......
}
-
quickreject()
- 作用:判断和某个矩形相交
- 具体措施:若判断与矩形相交,则可跳过相交的区域,从而缩小适度绘制
其余优化计划
布局调优工具
- 背景 只管曾经留神到上述的优化策略,但理论开发中不免还是会呈现布局性能的问题
- 解决方案 应用 布局调优工具
此处次要介绍 罕用的:
hierarchy viewer
、Profile GPU Rendering
、Systrace
1 Hierarchy Viewer
- 简介
Android Studio
提供的 UI 性能检测工具。 - 作用 可视化取得 UI 布局设计构造 & 各种属性信息,帮忙咱们优化布局设计
即:不便查看
Activity
布局,各个View
的属性、布局测量 - 布局 - 绘制的工夫
2.Profile GPU Rendering
- 简介 一个 图形监测工具
- 作用 渲染、绘制性能追踪
能实时反馈以后绘制的耗时
- 具体应用 横轴 = 工夫、纵轴 = 每帧的耗时;随着时间推移,从左到右的刷新出现
提供一个规范的耗时,如果高于规范耗时,就示意以后这一帧失落
3.Systrace
- 简介
Android 4.1
以上版本提供的性能数据采样 & 剖析工具 - 作用 检测
Android
零碎各个组件随着工夫的运行状态 & 提供解决方案
- 收集 等运行信息,从而帮忙开发者更直观地剖析零碎瓶颈,改良性能 检测范畴包含:
Android
要害子系统(如WindowManagerService
等Framework
局部要害模块)、服务、View 零碎- 性能包含:跟踪零碎的
I/O
操作、内核工作队列、CPU
负载等,在 UI 显示性能剖析上提供很好的数据,特地是在动画播放不晦涩、渲染卡等问题上
Android 性能优化总结
实践方面
Android 的性能优化牵扯的知识点很多,除了下面讲过的这些罕用解决方案,底层原理也值得咱们深入探讨,此外还有性能监控还有工具的应用。
一篇文章难以详尽,我依据本人的 Android 开发教训把这些性能优化的底层原理还有各种问题的解决方案等都整顿成了 PDF 文档。心愿能帮到你们
我的项目实战
除了实践局部,这边还给大家整顿了一份各大厂的 Android 性能优化实战案例,外面具体的向大家介绍了互联网巨头的性能优化计划。
因为文章篇幅无限,文档资料内容较多,有须要相干学习材料的敌人能够点击这里收费支付!
最初
一个优良的程序员,他不仅要懂得原理,还得去学习把技术使用到实际中去,这是一个优良的程序员所必须具备的。如果我的这篇文章能帮忙到你的话,那就多多反对一下我。
正文完