在Android上进行OpenGL ES 2.0渲染的最佳实践

问题描述 投票:2回答:1

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

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

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

java android opengl-es opengl-es-2.0
1个回答
0
投票

您需要做的是匹配显示器的帧速率,并根据自上一帧开始经过的时间推进游戏状态。有两种方法可以解决这个问题:

  1. 填充BufferQueue并依赖“交换缓冲区”背压。 这很容易实现:只需尽可能快地交换缓冲区。在Android的早期版本中,这实际上可能会导致SurfaceView#lockCanvas()让你睡眠100毫秒。现在,它由BufferQueue控制,BufferQueue可以像SurfaceFlinger一样快速清空。
  2. 使用编舞。 编舞器允许您设置在下一个VSYNC上触发的回调。实际的VSYNC时间作为参数传递。因此,即使您的应用程序没有立即唤醒,您仍然可以准确了解显示刷新周期何时开始。使用此值而不是当前时间,可为游戏状态更新逻辑生成一致的时间源。

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

© www.soinside.com 2019 - 2024. All rights reserved.