一、刷新机制(VSYNC与双缓冲/三缓冲)
1. VSYNC信号
-
作用:垂直同步信号,屏幕刷新周期(通常60Hz = 16.67ms)
-
类型:
- HW-VSYNC:硬件产生
- SW-VSYNC:软件模拟
2. 双缓冲机制
java
// 传统双缓冲问题
帧1:CPU计算 → GPU渲染 → 显示
帧2:CPU计算 → GPU渲染 → 显示
// 如果渲染超过16.67ms,会掉帧
3. Project Butter引入的改进
- VSYNC同步:所有绘制与VSYNC对齐
- 三缓冲:增加一个缓冲区减少等待
// 三缓冲流程
VSYNC 1:CPU计算帧1 → GPU渲染帧1
VSYNC 2:CPU计算帧2 → GPU渲染帧2
VSYNC 3:CPU计算帧3 → GPU渲染帧3
// 同时GPU可以并行处理不同帧
二、绘制机制(View绘制流程)
1. 绘制三大步骤
java
// ViewRootImpl.performTraversals()触发
1. Measure (测量)
2. Layout (布局)
3. Draw (绘制)
2. Measure过程
java
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 1. 根据父容器的MeasureSpec和自身LayoutParams计算
// 2. 测量子View
// 3. 设置最终尺寸setMeasuredDimension()
}
MeasureSpec组成:
-
高2位:测量模式
- UNSPECIFIED:父容器不限制
- EXACTLY:精确值(match_parent或具体数值)
- AT_MOST:最大不超过(wrap_content)
-
低30位:测量值
3. Layout过程
java
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// 确定View自身位置
// 确定子View位置(如果是ViewGroup)
}
4. Draw过程
java
public void draw(Canvas canvas) {
// 绘制顺序:
// 1. 绘制背景 (drawBackground)
// 2. 如果需要,保存图层
// 3. 绘制内容 (onDraw)
// 4. 绘制子View (dispatchDraw)
// 5. 绘制装饰(滚动条等)
// 6. 绘制前景
}
三、Choreographer核心调度器
1. 主要作用
java
// 协调VSYNC与绘制流程
public final class Choreographer {
// 三种回调类型
public static final int CALLBACK_INPUT = 0;
public static final int CALLBACK_ANIMATION = 1;
public static final int CALLBACK_TRAVERSAL = 2; // 绘制回调
// 注册VSYNC回调
public void postFrameCallback(FrameCallback callback);
}
2. 绘制调用链
Choreographer.postFrameCallback()
↓
VSYNC信号到来
↓
Choreographer.doFrame()
↓
ViewRootImpl.performTraversals()
↓
View.measure() → View.layout() → View.draw()
四、硬件加速 vs 软件绘制
1. 软件绘制
- Canvas:Skia 2D图形库
- DisplayList:无,直接绘制
- 渲染:CPU完成
2. 硬件加速(Android 3.0+)
java
// 开启硬件加速
android:hardwareAccelerated="true"
硬件加速流程:
text
View.draw() → 生成DisplayList → 上传GPU → GPU渲染
优势:
- GPU并行处理
- 支持属性动画优化
- DisplayList重用
五、完整绘制流程时序
六、性能优化关键点
1. 减少绘制范围
java
// 使用setWillNotDraw(true)跳过不必要的绘制
if (背景透明 && 没有覆盖onDraw) {
setWillNotDraw(true);
}
2. 避免过度绘制
xml
<!-- 开启调试 -->
<!-- 1. 蓝色:绘制1次 -->
<!-- 2. 绿色:绘制2次 -->
<!-- 3. 淡红:绘制3次 -->
<!-- 4. 深红:绘制4次+ -->
3. 使用RenderThread(Android 5.0+)
java
// UI线程:生成DisplayList
// RenderThread:上传GPU,执行渲染
4. 优化建议
- 减少View层级:使用ConstraintLayout
- 避免频繁requestLayout()
- 使用ViewStub延迟加载
- 复用ConvertView
- 关闭不需要的硬件加速
七、总结
Android刷新绘制机制的核心是:
- VSYNC同步确保流畅性
- Choreographer协调调度
- Measure-Layout-Draw三步绘制
- 硬件加速提升性能
理解这套机制有助于:
- 避免卡顿和掉帧
- 优化应用性能
- 实现流畅的动画效果
- 正确使用各种UI组件