在systrace中获取BufferQueue状态

时间:2015-01-09 16:55:06

标签: android vsync systrace surfaceflinger

我试图更好地了解我的应用程序如何与Android的缓冲系统进行交互。具体来说,我想优化何时将帧添加到SurfaceFlinger的BufferQueue中,与Vsync信号相关。

我知道在使用它们时,BufferQueue信息包含在SurfaceViews中:

      Binder_1-276   (  171) [001] ...1 34110.301903: tracing_mark_write: C|171|SurfaceView|1
surfaceflinger-171   (  171) [001] ...1 34110.314233: tracing_mark_write: C|171|SurfaceView|0

如果我使用TextureView怎么办?在这些情况下没有SurfaceView计数器。不使用SurfaceView时是否还有其他缓冲区状态指示?应用程序计数器是否也表示BufferQueue状态?

      Binder_2-279   (  171) [000] ...1 34169.029234: tracing_mark_write: C|171|com.android.grafika/com.android.grafika.PlayMovieActivity|1

BufferQueueProducer.cpp和BufferQueueConsumer.cpp中的以下行似乎暗示了这一点,但如果可能的话,我可以使用置信度投票:

ATRACE_INT(mCore->mConsumerName.string(), mCore->mQueue.size());

1 个答案:

答案 0 :(得分:0)

BufferQueue信息在systrace / atrace / ftrace中可用,但有一些注意事项。

在跟踪中,您可能会看到SurfaceView调试信息;这将显示BufferQueue状态(但仅在使用SurfaceView的情况下!)。

Binder_4-1188  (  171) [000] ...1 12563.059605: tracing_mark_write: C|171|SurfaceView|1

在这种情况下,BufferQueue = 1

如果您需要在非SurfaceView应用程序(例如,TextureView)中使用此信息,则数据仍可在包名称下使用:

Binder_2-279   (  171) [000] ...1 12668.678680: tracing_mark_write: C|171|com.google.android.youtube/com.google.android.apps.youtube.app.WatchWhileActivity|1

此外,还有多个BufferQueues,这只会告诉你BufferQueue的状态。