Android刷新与绘制机制详解 笔记

0 阅读3分钟

一、刷新机制(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重用

五、完整绘制流程时序

deepseek_mermaid_20260105_b325ce.png

六、性能优化关键点

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刷新绘制机制的核心是:

  1. VSYNC同步确保流畅性
  2. Choreographer协调调度
  3. Measure-Layout-Draw三步绘制
  4. 硬件加速提升性能

理解这套机制有助于:

  • 避免卡顿和掉帧
  • 优化应用性能
  • 实现流畅的动画效果
  • 正确使用各种UI组件