android display 笔记(十三)surfcaeflinger的DEQUEUED、QUEUED

  1. BufferQueue 的核心作用
    BufferQueue 是 生产者-消费者模型 的核心组件,协调应用(生产者)和 SurfaceFlinger(消费者)之间的图形缓冲区(GraphicBuffer)传递。

生产者:应用(如 Camera、游戏)通过 dequeueBuffer 获取缓冲区并填充内容。

消费者:SurfaceFlinger 通过 acquireBuffer 获取已填充的缓冲区并合成显示。

FREE :缓冲区空闲,可被生产者获取 初始化或 releaseBuffer 后 缓冲区池中的待分配状态

DEQUEUED :缓冲区被生产者获取,正在填充数据(如 GPU 渲染或 Camera 写入) dequeueBuffer() 应用调用 Canvas.lock() 或 OpenGL 渲染前

QUEUED :生产者已填充数据并提交给 BufferQueue,等待消费者(SurfaceFlinger)处理 queueBuffer() 应用完成帧渲染后提交

ACQUIRED :消费者(SurfaceFlinger)已获取缓冲区,准备合成或显示 acquireBuffer() SurfaceFlinger 正在合成该帧

队列阻塞(QUEUED 积压)
现象:
SurfaceFlinger 未及时消费 QUEUED 缓冲区,导致应用渲染阻塞。

原因:

VSync 信号丢失或合成耗时过长。

消费者未及时调用 releaseBuffer。

解决:

adb shell dumpsys SurfaceFlinger --latency  # 检查帧提交延迟

你可能感兴趣的:(笔记)