当前位置: 代码迷 >> java >> Android游戏GLSurfaceView的时间处理
  详细解决方案

Android游戏GLSurfaceView的时间处理

热度:89   发布时间:2023-07-17 20:35:00.0

我正在尝试使用Java和OpenGL ES 2.0制作一个小型android游戏。 目前,我正在尝试创建一个良好的游戏循环,以使物体在移动时保持平稳。 我尝试了4种方法,但是所有这些方法都使我不高兴。

这是我的方法:

方法1:

@Override
public void onDrawFrame(GL10 gl)
{
    game.update(1.0f / 60.0f);
    game.render();
}

结果:

大约所有2秒都有一点滞后/延迟。 在两秒钟之间,它的滑落非常平稳。

方法二:

@Override
public void onDrawFrame(GL10 gl)
{
        newTime = System.currentTimeMillis();
        delTime = newTime - oldTime;
        oldTime = newTime;

        game.update(delTime / 1000.0f);
        game.render();
}

结果:

大约所有2秒钟都有一点滞后/延迟,与“方法1”完全相同。 在两秒钟之间,它的滑落非常平稳。

方法3:

@Override
public void onDrawFrame(GL10 gl)
{
        newTime = System.currentTimeMillis();
        delTime = newTime - oldTime;
        oldTime = newTime;
        lagTime += delTime;

        // 18ms ~ 55 Frames per second
        while(lagTime >= 18)
        {
            game.update(18 / 1000.0f);

            lagTime -= 18;
        }

        game.render();
}

结果:

大约所有0.5秒都有一点延迟/延迟。 感觉从来都不流畅。

方法4:

@Override
public void onDrawFrame(GL10 gl)
{
    newTime = System.currentTimeMillis();
    delTime = newTime - oldTime;
    oldTime = newTime;
    lagTime += delTime;

    // 18ms ~ 55 Frames per second
    while(lagTime >= 18)
    {
        game.update(18 / 1000.0f);

        lagTime -= 18;
    }

    // Render all linear interpolated dependent on the lag time.
    game.render(lagTime / 1000.0f);
}

结果:

大约所有2秒都有一点延迟/延迟,与“方法1”和“方法2”完全相同。 在两秒钟之间,它的滑落非常平稳。

摘要:

我很确定我没有分配内存,因此GC不能正常工作,但是还有什么会导致所有2秒的延迟?

以及为什么GLSurfaceView每秒准确地每秒60次调用“ onDrawFrame”方法而我却不做(有时也每秒58或62次),我认为它经常调用该方法并且60 FPS听起来不是随机的,所以有可能指定此速率以及在其他设备上的行为方式?

那么,对于一个带有快速移动物体的简单2D游戏,那么没有这种滞后要花2秒钟的所有时间的简单好方法到底是怎么回事呢(所以40-60 FPS应该是最小的)?

如果重要的话,我在Android 5.1.1上的Nexus 7(2013)上测试了这些方法。

好的,尝试解决此问题几天后,我找到了另一个解决方案。 现在,我仅将平均增量时间设为5帧。 这似乎工作得更好,但并不完美。

为什么需要在While语句中将18.f / 1000.f传递到函数中?

在游戏循环的While循环中调用update()并不常见。 无需代码检查FPS和while循环即可再次对其进行测试。

如果什么都没有发生,我将怀疑是否有什么东西正在分配。

更新

80ms,无话可说,没办法,增量时间应该小于20ms。 我认为很容易找到原因。 尝试运行一个使用opengl es视图的官方android示例,如果再次发生,则由于设备问题,没人知道它是什么。 但是,我认为将其与具有主要活动的GLSurfaceview中的示例代码进行比较可以很好地工作,或者您可以在此处向我展示您的整个代码,因为它应该很简短。

  相关解决方案