我一直在专用线程中更新SurfaceView,其中一个紧密循环以lockCanvas开头,以unlockCanvasAndPost结束。
无论绘图有多简单,我都不会超过60FPS,因为这是显示器的刷新率。
我的问题是:如何执行此最高费率?
我希望lockCanvas成为阻塞方法(即插入适当延迟的方法),但分析似乎表明lockCanvas和unlockCanvasAndPost都会导致限制速率的延迟。
答案 0 :(得分:2)
lockCanvas()
获取要绘制的缓冲区,unlockCanvas()
将缓冲区提交给系统合成器。如果没有空闲缓冲区,lockCanvas()
将阻塞,直到有一个空闲缓冲区可用。如果SurfaceFlinger不立即处理IPC消息,unlockCanvas()
可能会停止,但通常解锁应该快速返回。
如果您想了解图形系统的工作原理,请参阅graphics architecture doc。特别感兴趣的是关于game loops的部分;你正在做的是“队列填充”,这很容易做到,但延迟特性比基于Choreographer的方法略差。