【问题标题】:Best practice for OpenGL ES 2.0 rendering on AndroidAndroid 上 OpenGL ES 2.0 渲染的最佳实践
【发布时间】:2019-02-13 22:46:20
【问题描述】:

到目前为止,使用我使用过的语言和库,始终可以选择将程序的主循环(游戏或任何具有不断变化的上下文的东西)同步到当前显示器的刷新率。所以我可以选择打开 VSYNC 或者让循环每秒执行尽可能多的次数。我指的是 SDL2、带有 GLFW 的 OpenGL 3.0、HTML5 画布等。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

      这很容易实现:尽可能快地交换缓冲区。在早期版本的 Android 中,这实际上可能会导致 SurfaceView#lockCanvas() 让您休眠 100 毫秒的惩罚。现在它是由 BufferQueue 来控制的,并且 BufferQueue 会在 SurfaceFlinger 的能力范围内尽快清空。

    2. 使用 Choreographer。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多