При исследовании проблемы с заиканием игры я обнаружил, что между eglSwapBuffer() из игры и postFramebuffer() в Surfaceflinger всегда есть задержка в «SurfaceView», которая длится от 0,5 мс до 10 мс, что кажется довольно случайным и не имеет отношения к загрузке ЦП. Что это на самом деле представляет? Это как-то связано с точкой отображения VSYNC?
Что представляет SurfaceView в результате systrace?
Ответы (1)
Эта строка представляет BufferQueue. Высота элемента (0 или 1 в видимой части вашей трассировки) указывает, сколько буферов присутствует в очереди.
В данном случае это очередь графических буферов, представленных на поверхности SurfaceView. Когда ваше приложение вызывает eglSwapBuffers()
, оно отправляет буфер в очередь. Когда SurfaceFlinger просыпается по сигналу VSYNC, он фиксирует буфер из очереди, если он доступен, и объединяет его для следующего обновления.
Обновление: BufferQueues и их использование подробно описаны здесь а>. Приложение C упоминает их появление в systrace.
person
fadden
schedule
27.03.2014