SurfaceView刷新率实现
SurfaceView refresh rate implementation
我不断地在专用线程中更新 SurfaceView,其中包含一个以 lockCanvas 开始并以 unlockCanvasAndPost 结束的紧密循环。
无论绘图多么简单,我都不会超过 60FPS,这是有道理的,因为这是显示器的刷新率。
我的问题是:这个最高费率是如何执行的?
我希望 lockCanvas 成为 blocking 方法(即插入适当延迟的方法),但分析似乎表明 lockCanvas 和 unlockCanvasAndPost 都对延迟有贡献这限制了速率。
lockCanvas()
获取要绘制的缓冲区,unlockCanvas()
将缓冲区提交给系统合成器。如果没有空闲缓冲区,lockCanvas()
将阻塞直到有可用缓冲区。如果 SurfaceFlinger 不立即处理 IPC 消息,unlockCanvas()
可能会停止,但通常解锁应该 return 很快。
如果您想了解图形系统的工作原理,请参阅 graphics architecture doc. Of particular interest will be the section on game loops;您正在做的是 "queue stuffing",这很容易做到,但延迟特性比基于 Choreographer 的方法稍差。
我不断地在专用线程中更新 SurfaceView,其中包含一个以 lockCanvas 开始并以 unlockCanvasAndPost 结束的紧密循环。
无论绘图多么简单,我都不会超过 60FPS,这是有道理的,因为这是显示器的刷新率。
我的问题是:这个最高费率是如何执行的?
我希望 lockCanvas 成为 blocking 方法(即插入适当延迟的方法),但分析似乎表明 lockCanvas 和 unlockCanvasAndPost 都对延迟有贡献这限制了速率。
lockCanvas()
获取要绘制的缓冲区,unlockCanvas()
将缓冲区提交给系统合成器。如果没有空闲缓冲区,lockCanvas()
将阻塞直到有可用缓冲区。如果 SurfaceFlinger 不立即处理 IPC 消息,unlockCanvas()
可能会停止,但通常解锁应该 return 很快。
如果您想了解图形系统的工作原理,请参阅 graphics architecture doc. Of particular interest will be the section on game loops;您正在做的是 "queue stuffing",这很容易做到,但延迟特性比基于 Choreographer 的方法稍差。