Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android上OpenGL ES 2.0渲染的最佳实践_Java_Android_Opengl Es_Opengl Es 2.0 - Fatal编程技术网

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

Java Android上OpenGL ES 2.0渲染的最佳实践,java,android,opengl-es,opengl-es-2.0,Java,Android,Opengl Es,Opengl Es 2.0,到目前为止,在我使用的语言和库中,始终有一个选项可以将程序的主循环(游戏或任何具有不断变化上下文的内容)同步到当前显示器的刷新率。所以我可以选择打开VSYNC或者让循环每秒执行尽可能多的次数。我指的是SDL2、带GLFW的OpenGL3.0、HTML5画布等 我正在OpenGLES2.0中寻找Android上类似的东西,但到目前为止,我能找到的所有示例代码都只是使用了sleep的一种变体,并将帧率设置为60或30。因此,它们基本上计算自上一次迭代以来经过的时间量,并且仅在经过给定的时间量(每秒6

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

我正在OpenGLES2.0中寻找Android上类似的东西,但到目前为止,我能找到的所有示例代码都只是使用了sleep的一种变体,并将帧率设置为60或30。因此,它们基本上计算自上一次迭代以来经过的时间量,并且仅在经过给定的时间量(每秒60帧的情况下为0.016毫秒)时才进一步前进并调用requestRender()函数


我只是想知道是否有比这更好的选择。我只是担心不是每部手机都有相同的屏幕刷新率,所以硬编码似乎不是一种理想的方法。据我所知,计算出给定手机的刷新率并不是那么简单,或者至少“纯”Java和OpenGL是不可能的。

您需要做的是匹配显示器的帧速率,并根据上一帧后经过的时间提前游戏状态。有两种方法可以做到这一点:

  • 将缓冲队列填满,并依靠“交换缓冲”背压

    这很容易实现:只要尽可能快地交换缓冲区即可。在Android的早期版本中,这实际上可能会导致一个惩罚,SurfaceView#lockCanvas()会让你睡眠100毫秒。现在,它由BufferQueue来调整速度,并且BufferQueue会尽可能快地清空

  • 使用编舞

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

  • 资料来源: