使用OpenGL ES 2.0在Android中进行双缓冲页翻转

使用OpenGL ES 2.0在Android中进行双缓冲页翻转,android,opengl-es,vsync,surfaceflinger,Android,Opengl Es,Vsync,Surfaceflinger,从Froyo和更高版本开始,我可以安全地接近Android设备的图形硬件吗 我想在Android设备上实现一个简单的页面翻转方案,使用两个帧缓冲区 应该是这样的: 渲染到帧缓冲区A中。(帧缓冲区A是后缓冲区,当前显示帧缓冲区B。) 等待下一个VSYNC(可能是VSYNC中断?) 告诉操作系统显示帧缓冲区A,并使帧缓冲区B成为后缓冲区 渲染到帧缓冲区B。(帧缓冲区B是后缓冲区,当前显示帧缓冲区A。) 等待下一个VSYNC(可能是VSYNC中断?) 告诉操作系统显示帧缓冲区B,并使帧缓冲区A成为后缓

从Froyo和更高版本开始,我可以安全地接近Android设备的图形硬件吗

我想在Android设备上实现一个简单的页面翻转方案,使用两个帧缓冲区

应该是这样的:

  • 渲染到帧缓冲区A中。(帧缓冲区A是后缓冲区,当前显示帧缓冲区B。)

  • 等待下一个VSYNC(可能是VSYNC中断?)

  • 告诉操作系统显示帧缓冲区A,并使帧缓冲区B成为后缓冲区

  • 渲染到帧缓冲区B。(帧缓冲区B是后缓冲区,当前显示帧缓冲区A。)

  • 等待下一个VSYNC(可能是VSYNC中断?)

  • 告诉操作系统显示帧缓冲区B,并使帧缓冲区A成为后缓冲区

  • 重复步骤1-6

    每秒更新显示器15-25次最适合我的需要。(我永远不需要60 fps或高于30 fps的速度。)


    我计划只使用OpenGL ES 2.0进行所有渲染。

    您不需要这样做。如果您这样做,您的缓冲将与操作系统为您所做的缓冲冗余,并且只会增加延迟和开销

    您可以从中了解当前的Android图形体系结构。旧版本的Android有很大不同,但双缓冲或三缓冲的概念从一开始就出现在Android中。这在很大程度上是OpenGL ES工作原理的一部分

    应用程序方面的一个棘手问题是,如果你想用VSYNC来调整你的应用程序行为(而不是在填充队列时阻塞),那么就要弄清楚VSYNC何时到达。有关详细信息,请参阅文档的“游戏循环”部分,但要知道,您可以使用它在API 16+上获取VSYNC计时


    据统计,Froyo和更早的公司约占市场的0.7%。以姜饼和更晚的为目标更为典型。如果您以API 16(第一个Jellybean版本)为目标,您现在将损失约25%(13.5%姜饼,11.4%集成电路),大部分是姜饼附带的低端设备,因为其硬件要求较低。

    通常,德国劳埃德船级社的双缓冲正是这样做的。所以这里没有什么需要实现的。@derhass:我在Jelly Beans之前读过,Android不保证开始显示新的准备显示缓冲区。所以我的理解是,如果可能的话,我最好自己实现翻页。谢谢你的回答,法登先生。我刚刚投了“有用”的票。是的,我刚刚发现Froyo不再是Android市场的重要部分。我现在可以放弃Froyo,这将使我可以选择使用VBO,而不用使用NDK。