View 性能优化与卡顿分析
View 性能优化与卡顿分析
打造 60fps 流畅应用的实战指南
目录
1. 性能指标与优化目标
60fps 原则
1 | ┌─────────────────────────────────────────────────────────────────────┐ |
卡顿原因
| 原因 | 占比 | 解决方案 |
|---|---|---|
| 过度绘制 | 40% | 移除不必要的背景 |
| 布局复杂 | 25% | 优化布局层级 |
| 主线程耗时 | 20% | 异步处理 |
| 内存问题 | 15% | 减少 GC |
2. 卡顿原因分析
过度绘制 (Overdraw)
1 | // ❌ 问题:多层背景导致过度绘制 |
解决过度绘制
1 | // 开启过度绘制检测 |
3. 布局优化
Hierarchy Viewer 检测
1 | 优化前层级: |
使用 ConstraintLayout 扁平化
1 | // ❌ 嵌套层级深 |
include 与 merge
1 | <!-- layout_title.xml --> |
4. 绘制优化
减少 onDraw 调用
1 | // ❌ 错误:每次 invalidate 都重新创建对象 |
使用 Canvas.save()/restore()
1 | override fun onDraw(canvas: Canvas) { |
硬件加速
1 | // 开启硬件加速 |
5. 内存优化
避免内存抖动
1 | // ❌ 错误:在 onDraw 中分配对象 |
减少对象创建
1 | // ❌ 错误:频繁创建对象 |
6. 调试工具
Systrace
1 | # 命令行使用 |
Perfetto
1 | # Android 11+ 使用 Perfetto |
Layout Inspector
1 | 使用步骤: |
开发者选项
| 选项 | 作用 |
|---|---|
| GPU 过度绘制 | 显示过度绘制区域 |
| GPU 渲染分析 | 显示每帧渲染时间 |
| 关闭硬件加速 | 测试软件渲染 |
性能优化 checklist
1 | ┌─────────────────────────────────────────────────────────────────────┐ |
面试常问
| 问题 | 答案 |
|---|---|
| 16ms 包含什么? | measure + layout + draw + GPU 渲染 |
| 过度绘制如何检测? | 开发者选项 GPU 过度绘制 |
| onDraw 为什么不能创建对象? | 触发 GC 导致卡顿 |
| ConstraintLayout 优势? | 扁平化、性能好 |
总结
1 | View 性能优化核心: |
相关文章: