我目前在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
在Android平台代码中的BufferQueueConsumer.cpp文件中(例如。,https://android.googlesource.com/platform/frameworks/native/+/android-5.0.1_r1/libs/gui/BufferQueueConsumer.cpp),检查acquireBuffer函数。
在某些情况下(例如,缓冲区已过期),函数可能会决定从队列中删除缓冲区。没有任何迹象表明该事件正在发生,您只会看到缓冲区的大小从2跳到0。
还有可能使用紧密交错的queueBuffer/acquisiteBuffer命令,在这些命令中打印一些意外的缓冲区大小转换。