Android中标准的OpenGLES实现需要三倍于surface的缓冲区。三倍的缓冲区为了增加平滑度而增加了延时。对于大部分App来说,这是一个有争议的折衷。但是对于VR来说,这毫无疑问是很烂的选择。一个消耗大量GPU资源及从来不强制同步的APP会有超过50ms的延时,从eglSwapBuffers()调用到开始更新屏幕的像素,即使它的运行帧率是60Fps。
Android很可能会提供一个严格的双缓冲区模式,也有概率提供一个交换撕裂选择。但是一个令人失望的事实是,即便这样,当你提交一个buffer给系统时,有可能系统并不会立即做你想要做的事。最后的选择是根本就不要用缓冲区链,而是只用一个缓冲区,你可以在它扫描到显示屏时进行渲染。为了避免画面撕裂,App应该只绘制那些不是正在扫描输出的窗口区域。
当home键在底部时,手机显示屏内部是按纵向模式从上到下进行扫描的。当在头盔里面时,手机显示屏是从左到有扫描的。VrApi接收显示垂直同步的时间标记事件,用它们来确定在一个特定时间时,显示扫描光栅所在的位置。当前的代码逻辑是当在显示左眼图像时,扭曲右眼的图像,当在显示右眼的图像时,扭曲左眼的图像。这只会带来8ms的延时,从图像的第一个像素开始更新计算。显示器扫描半屏只耗时8ms,所以在每个眼睛延时会有所不同。