Java 不同帧率的游戏版本中的LibGDX差异

Java 不同帧率的游戏版本中的LibGDX差异,java,libgdx,Java,Libgdx,我从游戏开发开始我的冒险,我选择了LibGDX作为开始。 我有一个关于速度和帧率的问题 float position x=0f; float velosity v=200f; float force f=-15f; public void update(float deltaTime){ v+=f; v*=deltaTime; x+=v; v*=1/deltaTime; } 在我的代码中,有一些力在每一帧上降低速度。然后在同一时间之后,一个以30帧每秒的速度玩游

我从游戏开发开始我的冒险,我选择了LibGDX作为开始。 我有一个关于速度和帧率的问题

float position x=0f;
float velosity v=200f;
float force f=-15f;
public void update(float deltaTime){
    v+=f;
    v*=deltaTime;
    x+=v;
    v*=1/deltaTime;
}
在我的代码中,有一些力在每一帧上降低速度。然后在同一时间之后,一个以30帧每秒的速度玩游戏的玩家会比以60帧每秒的速度玩游戏的玩家移动得更远,因为力对他的影响会更少。我说得对吗?
如果是这样的话,我如何确保两个玩家移动相同的距离?我应该使用完全不同的方法吗?

您可以将移动与增量时间值(帧间时间)相乘,使其与帧率无关。使用libgdx,可以使用以下方法:

Gdx.graphics.getDeltaTime();
下面是一个简单的例子:

   x += 500 * Gdx.graphics.getDeltaTime();

你说得对。如果帧速率不同,则时间步长也不同,因此加速度的速率将有点不可预测。这就是为什么许多游戏使用与游戏帧速率分开运行的固定时间步长。这是一种确保游戏在每台设备上完全相同的方式

如果这是一个简单的游戏,没有很强的竞争力,那么你只需要确保它保持准确,而不一定是确定性的。如果是这样的话,在我看来,你可以作弊一点,使用最大时间步长而不是固定时间步长。游戏不会一直玩得一模一样,但它足够精确,没有人会注意到。为此,请设置一些最大增量时间。在游戏的每一帧上,反复调用update,直到所有的增量时间都用完,但是总的增量时间仍然是准确的。例如:

public static final float MAX_DELTA = 1/50f;
public static final int MAX_UPDATES_PER_FRAME = 3;
private float elapsedTime;

public void render (float deltaTime){
    elapsedTime += deltaTime;
    int updates = 0;
    while (elapsedTime > 0 && updates < MAX_UPDATES_PER_FRAME){
        update(Math.min(MAX_DELTA, elapsedTime));
        elapsedTime = Math.max(0, elapsedTime - MAX_DELTA);
        updates++;
    }

    // drawing
}

这会导致难看的口吃,并且只能通过保留游戏所有位置数据的两个副本,在每一帧之间交替,并使用剩余的
elapsedTime
在这两个副本之间进行插值来修复,以获得适合绘制平滑动画的值。非常复杂

这就是我在我的问题中所做的,我将速度乘以时间增量,并将其加到当前位置。但是当速度不是恒定的,并且在每一帧中降低时,fps较低的玩家将比fps较高的玩家移动得更远,不是吗?是的,他在每一帧移动得更远,但fps较高的玩家移动的次数比fps较低的玩家多。因此,根据我的计算,在1秒后,如果两个玩家都按一次前进按钮,每1秒1fps的玩家将比每秒30fps的玩家多移动40个单位。40是相当大的差异,我不想让用户利用这一点,以较低的fps获得更高的分数
public static final float FIXED_TIMESTEP = 1/50f;
public static final int MAX_UPDATES_PER_FRAME = 3;
private float elapsedTime;

public void render (float deltaTime){
    elapsedTime += deltaTime;
    int updates = 0;
    while (elapsedTime >= FIXED_TIMESTEP = && updates < MAX_UPDATES_PER_FRAME){
        update(FIXED_TIMESTEP);
        elapsedTime -= FIXED_TIMESTEP;
        updates++;
    }

    // drawing
}