gpt4 book ai didi

java - Android 上 OpenGL ES 2.0 渲染的最佳实践

转载 作者:行者123 更新时间:2023-11-29 02:30:50 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

  2. 使用 Choreographer。

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

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

关于java - Android 上 OpenGL ES 2.0 渲染的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49693879/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com