这是我参与「第四届青训营 」笔记创作活动的第13天。本文主要对性能优化课程做出梳理,也对性能优化有一个入门认知:包括性能优化的覆盖点、主要着重点与优化思想。
why
-
硬件性能速度变还
-
ARM平台受益于架构和工艺的严谨,最近几年趋势比x86平台好
-
多核带来的提升取决于可以真正并行执行的部分(软件可以持续性优化)
-
。。。
目标(性能即体验)
- 快:最快显示效率、最快网络速率、最快UI响应
- 稳:最佳用户体验,减少强打断(例如游戏)
- 省:最低存储、最低功耗、最低流量消耗、最低计算资源(例如边下载边删除)
一、流畅性优化
刷新
关键词:每帧的时间不应超过16ms,以达到每秒60fps(60帧)的呈现速度。
卡顿:应用存在界面呈现缓慢的问题,系统选择掉过一些帧,这导致了用户感觉感觉不流畅,也就是卡顿。
解决
让耗时操作移到其他线程工作,让主线程只为交互(输入输出)刷新(UI绘制)负责。
- 最低25帧时不感觉到卡顿。
16ms:1000/60hz,相当于60fps。人眼与大脑之间的写作无法感知超过60fps的画面更新。
12fps 大概类似手动快速翻动书籍的帧率, 这明显是可以感知到不够顺滑的。24fps 使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的效果。 24fps 是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。 但是低于 30fps 是 无法顺畅表现绚丽的画面内容的,此时就需要用到 60fps 来达到想要的效果,超过 60fps 就没有必要了。如果我们的应用没有在 16ms 内完成屏幕刷新的全部逻辑操作,就会发生卡顿。
答案:A
画面撕裂:一帧渲染完而不是CPU读入一帧后
二、资源优化
最大化资源调度:最大资源调度分为两个方向,第一个方向将一些有限资源尽量向最影响体验的方向靠拢,首先要满足快,我们需要在网络、渲染等领域提供更多的资源。第二个方向,探寻更多的资源供给,首先要满足多,深度剖析系统资源使用,需要从系统层榨取更多的可用资源,也需要从用户敏感角度榨取更多资源,最终实现最大化资源调度。
最小化资源使用:需要对持续性的指标影响降到最低,首先要满足省,我们对功耗、存储、流量等指标在一些用户敏感度大于实际获得的体验的环境下,保障核心功能的体验。本质的原则就是保证业务基本面的前提下,通过降级或者优化等手段,将占用的资源做到最小。
资源优化分类:
用户上传的音频不同,上传后后台对其进行平衡。
三、稳定性
性能劣化->强制打断应用的使用体验。
四、系统级优化
- 2015ART后,流畅性提升
- 2018预编译后下发,关注性能与功耗的平衡问题
最佳工具选型
[GPU呈现模式](【Android 客户端专场 学习资料三】第四届字节跳动青训营 - 掘金 (juejin.cn))
- Layertool
- CPU Profiler
- TraceView
- 时间轴窗格
- 分析窗格
- Systrace 在系统一级运行的所有进程的时间信息。
- btrace-进阶
- Battery Historian
性能优化技术案例
性能监控价值
GPU呈现模式
Layertool
LayerTool工具:根据自定义需求过各个布局,然后在界面上提示对应的位置,可以有效查找导致overdraw的布局。
背景,实物绘制
CPU Profiler
TraceView
间隔太长函数抓取不到
Systrace
抓取耗时点
原生工具
Battery Historian
性能优化
现状分析
- CPU Time:占用CPU进行计算所花费的时间绝对值
- CPU Schedule
- IO Wait
- Lock Wait
- IPC 进程间通信
不要在主线程做IO操作等等
- 主线程优化
- 运行环境归因
- 前台运行
- 后台运行
- 后台线程优化
优化案例分享
耗时归因方式
渲染分析
View显示流程耗时因素
- 1
- UI
- 数据绑定
- View显示
答案:ABCD
UI构建的优化方案
将所有耗时操作放在另一边
数据绑定的优化方案
渲染和布局优化方案
渲染优化的异步化方案
优化书籍推荐:网上系列文档(抖音)、具体问题具体分析的(看源码)