Android游戏GLSurfaceView时间处理

时间:2015-07-30 10:45:31

标签: java android opengl-es-2.0

我正在尝试使用Java和OpenGL ES 2.0制作一款小型Android游戏。 目前,我正在努力创造一个良好的游戏循环,以获得平滑的感觉,例如对象正在移动。 我尝试了4种方法,但所有这些方法都让我感到不快乐。

这是我的方法:

方法1:

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

结果:

大约所有2秒都有一点延迟/延迟。 在2秒之间,它真的很顺利。

方法2:

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

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

结果:

大约所有2秒都有一点滞后/延迟,与“接近1”完全相同。 在2秒之间,它真的很顺利。

方法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”完全相同。 在2秒之间,它真的很顺利。

要点:

我很确定我没有分配内存,因此GC无法工作,但还有什么可能导致这些滞后2秒?

为什么GLSurfaceView每秒正好调用“onDrawFrame”方法60次而没有我做(有时候每秒58或62次)我认为它经常调用方法而且60 FPS听起来不是随机的是否可以指定此速率以及其在其他设备上的表现?

所以最后一个很好的简单方法是没有这个延迟,所有2秒的时间用于一个简单的2D游戏,快速移动的物体(所以40-60 FPS应该是最小的)?

如果它很重要,我使用Android 5.1.1测试了Nexus 7(2013)上的方法。

2 个答案:

答案 0 :(得分:1)

好的,经过几天试图解决这个问题后,我找到了另一个解决方案。 现在我只需要花费大约5帧的平均增量时间。 这似乎更好但不完美。

答案 1 :(得分:0)

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

在游戏循环中调用While循环中的update()并不常见。 在没有代码检查FPS和while循环的情况下再次测试它。

如果什么都没发生,我会怀疑是在分配什么。

<强>更新

80ms没有任何可以调用,没有办法,delta时间应该小于20ms。我觉得很容易找到原因。尝试运行一个使用opengl es视图的官方android示例然后如果它再次发生,没有人知道它是什么因为设备问题。但是,我认为它可以很好地与GLSurfaceview中的主要活动的示例代码进行比较,或者您可以在GLSurfaceview中向我展示您的整个代码,因为它应该是安静的。