Systrace 工具分析Triple Buffer

73 阅读2分钟

这篇文章通俗地讲解了 Android 中 Triple Buffer(三缓冲)机制的原理、作用,以及如何通过 Systrace 工具分析其对性能的影响,核心内容如下:

一、BufferQueue:屏幕渲染的 “画布仓库”

Android 屏幕渲染依赖于 BufferQueue(缓冲队列),它是一个 “生产者 - 消费者” 模型:

  • 生产者(App) :负责绘制画面,生成 “画布”(Buffer)。
  • 消费者(SurfaceFlinger) :负责将画布合成并显示到屏幕。
  • 核心问题:若生产者绘制太慢或消费者合成不及时,会导致画面卡顿或撕裂。

二、从单缓冲到三缓冲:解决 “画布不够用” 的问题

1. 单缓冲(Single Buffer)

  • 原理:只有 1 个画布,生产者画完后消费者使用,用完归还。
  • 问题:若绘制超时,屏幕刷新时拿不到新画布,出现画面撕裂(如滚动列表时突然断层)。
  • 现状:已被淘汰,仅作原理示例。

2. 双缓冲(Double Buffer)

  • 原理:2 个画布交替使用,生产者画 A 时消费者用 B,画 B 时用 A。
  • 问题:若生产者连续两帧超时,会导致消费者无新画布可用,连续掉帧(如滑动时突然卡住两次)。

3. 三缓冲(Triple Buffer)

  • 原理:3 个画布(A、B、C)轮转,生产者可同时处理两个画布,消费者使用一个。
  • 优势:即使生产者两帧超时,消费者仍有备用画布,减少掉帧次数(如双缓冲掉两次帧,三缓冲只掉一次)。

三、Systrace 如何判断掉帧?看两端配合

  1. App 端(生产者)

    • 主线程绘制耗时超过 16.6ms(60fps 标准),但未必直接掉帧,因可能有备用缓冲。
  2. SurfaceFlinger 端(消费者)

    • 关键看 BufferQueue 中可用画布数量:

      • 0 个:无画布可合成,必掉帧(画面卡住)。
      • 1-2 个:有备用画布,可能不影响显示。