在调查游戏卡顿问题时,我发现在游戏中的 eglSwapBuffer() 和 Surfaceflinger 中的 postFramebuffer() 之间,“SurfaceView”总是有一个延迟,从 0.5ms 持续到 10ms,这似乎非常随机且与 CPU 负载无关。这真正代表什么?它与 VSYNC 显示点有关吗?
问问题
1068 次
1 回答
1
该行代表一个 BufferQueue。元素的高度(跟踪可见部分中的 0 或 1)表示队列中存在多少缓冲区。
在这种情况下,它是在 SurfaceView Surface 上呈现的图形缓冲区队列。当您的应用调用eglSwapBuffers()
时,它会向队列提交一个缓冲区。当 SurfaceFlinger 在 VSYNC 信号上唤醒时,如果有可用的缓冲区,它会从队列中锁存一个缓冲区,并将其合成以供下一次刷新。
更新:此处详细描述了 BufferQueues 及其用途。附录 C 提到了它们在 systrace 中的出现。
于 2014-03-27T00:53:32.197 回答