在Android

时间:2018-04-06 13:25:47

标签: java android opengl-es opengl-es-2.0

使用我迄今为止工作的语言和库,总有一个选项可以将程序的主循环(游戏或任何具有不断变化的上下文的内容)同步到当前显示的刷新率。所以我可以选择打开VSYNC,或者让循环每秒执行多次。我指的是SDL2,带GLFW的OpenGL 3.0,HTML5画布等。

我现在正在OpenGL ES 2.0中寻找类似于Android的东西,但到目前为止我能找到的所有示例代码都只使用了睡眠的变化并将帧速率设置为60或30.所以它们基本上算了自上次迭代以来经过的时间量,并且仅在已经过了给定时间量的情况下进一步前进并调用requestRender()函数(如果每秒60帧,则为0.016 ms)。

我只是想知道是否有比这更好的选择。我只是担心并非每部手机都具有相同的屏幕刷新率,因此任何数量的硬编码似乎都不是理想的方法。据我了解,弄清楚给定手机的刷新率并不是那么简单,或者至少不能用" pure" Java和OpenGL。

1 个答案:

答案 0 :(得分:0)

您需要做的是匹配显示器的帧频,并根据自上一帧以来经过的时间前进游戏状态。有两种解决方法:

  1. 将BufferQueue塞满,并依靠“交换缓冲区”背压。

    这非常容易实现:只需尽快交换缓冲区即可。在早期的Android版本中,这实际上可能会导致SurfaceView#lockCanvas()使您进入睡眠状态100毫秒的惩罚。现在,它由BufferQueue加快速度,并且BufferQueue的排空速度与SurfaceFlinger一样快。

  2. 使用编舞。

    Choreographer允许您设置在下一个VSYNC上触发的回调。实际的VSYNC时间将作为参数传递。因此,即使您的应用没有立即唤醒,您仍然可以准确了解显示刷新周期的开始时间。使用此值而不是当前时间,可以为您的游戏状态更新逻辑提供一致的时间源。

来源:https://source.android.com/devices/graphics/arch-gameloops