Дельта-значение в методе рендеринга libgdx

Я проверил значение дельты в методе рендеринга в классе Screen. Я видел, что оно не постоянно. Может ли кто-нибудь сказать, откуда он взялся и что это такое? И отличается ли он в разных размерах экрана? Если это так, как мы можем преодолеть это? Я спрашиваю об этом, потому что прыжок моего игрока зависит от дельта-времени, а иногда он прыгает слишком высоко.....


person MGDroid    schedule 14.03.2014    source источник


Ответы (2)


deltaTime не имеет ничего общего с размерами экрана. Это количество времени, которое потребовалось для рендеринга последнего кадра. Рендеринг в случае LibGDX также включает всю логику, которую вы выполняете в своем методе render().

Обычно вы хотите, чтобы игра работала с одинаковой скоростью на разных устройствах. Если ваш метод рендеринга выглядит примерно так...

public void render(float deltaTime) {
    float speed = 5f;
    position = position + speed;
}

... тогда позиция будет меняться быстрее на быстрых устройствах и менее быстро на медленных только потому, что метод рендеринга вызывается разное количество раз.

Чтобы решить эту проблему, есть deltaTime, который в случае LibGDX находится в секундах. Чтобы позиция менялась с одинаковой скоростью на разных устройствах, обычно это делается так:

public void render(float deltaTime) {
    float speedPerSecond = 5f;
    position = position + (speedPerSecond * deltaTime);
}
person noone    schedule 14.03.2014

float delta в вашем методе render(delta) — это время между последним кадром и этим кадром, указанное в секундах. Вы можете получить это значение везде, вызвав Gdx.graphics.getDelta(). Это значение сглаживается по n кадрам. Чтобы получить реальное время (что в большинстве случаев не обязательно), вы можете вызвать Gdx.graphics.getRawDeltaTime(). Это значение используется для перемещения объектов в игре в зависимости от времени, прошедшего между кадрами, вместо их перемещения на фиксированное количество пикселей. Для этого вы можете просто умножить movementSpeed на это delta, чтобы получить расстояние, которое должен пройти ваш объект.

Я бы предложил ограничить ваше дельта-время, так как огромное дельта-время (вызванное медленными устройствами или чем-то еще) может испортить, например, обнаружение столкновений. Чтобы ограничить его, например, delta временем 30 кадров в секунду, вы можете просто сказать delta = Math.min(delta, 1/30);

person Springrbua    schedule 14.03.2014
comment
Я столкнулся с проблемой, что иногда высота прыжка моего игрока меняется. Но сколько времени я должен ограничить, как я могу это знать? - person MGDroid; 14.03.2014
comment
Ну, вы должны попробовать, потому что это зависит от дизайна игры. libgdx scene2D Stage, например, ограничивает его значением 1/30. Так что, если вы играете со скоростью ниже 30 кадров в секунду, дельта больше не учитывается. Попробуйте использовать разные значения и посмотрите, какое из них лучше для вас. - person Springrbua; 14.03.2014
comment
Я получаю другую дельту по сравнению с тем, если я сам делаю System.currentTimeMillis. Что может быть причиной этого? Если я делаю System.currentTimeMillis, я получаю постоянно низкие цифры, но если я беру дельту, то иногда я получаю очень большие цифры, полностью портящие мою анимацию движения. - person JohnyTex; 22.05.2016