android display 笔记(十三)surfcaeflinger的DEQUEUED、QUEUED
- 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 # 检查帧提交延迟