0

我目前在 Android 上使用 atrace 来记录和分析视频工作负载期间操作系统的状态。具体来说,我在整个执行过程中监控系统的 BufferQueue 大小。atrace 记录这些缓冲区的大小,因为它们随着时间的推移排队/获取。

然而,在我的一些痕迹中,这导致了不可能的情况。C|171|SurfaceView|x 行将“x”表示为缓冲区中排队的纹理数量。例如,有时在一次获取期间,会删除两个缓冲区而不是一个(这应该是不可能的):

     Binder_5-4526   (  171) [002] ...1  1621.656462: tracing_mark_write: B|171|queueBuffer
     Binder_5-4526   (  171) [002] ...1  1621.656493: tracing_mark_write: C|171|SurfaceView|2
surfaceflinger-171   (  171) [002] ...1  1621.664886: tracing_mark_write: B|171|acquireBuffer
surfaceflinger-171   (  171) [002] ...1  1621.664978: tracing_mark_write: C|171|SurfaceView|0
4

1 回答 1

1

在 Android 平台代码中的 BufferQueueConsumer.cpp 文件中(例如,https: //android.googlesource.com/platform/frameworks/native/+/android-5.0.1_r1/libs/gui/BufferQueueConsumer.cpp ),查看acquireBuffer功能。

在某些情况下(例如,缓冲区已过期),该函数可能决定从队列中删除缓冲区。没有任何迹象表明此事件正在发生,您只会看到缓冲区的大小从 2 跳到 0。

还有可能会出现紧密交错的 queueBuffer/acquireBuffer 命令,它们会打印一些意外的缓冲区大小转换。

于 2015-02-18T22:02:39.737 回答