Почему мой алгоритм прыжка не работает FPS-независимым? - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь реализовать простой алгоритм прыжка, который должен быть FPS-независимым.К сожалению, игрок прыгает на 1,6-1,9 блоков со скоростью 1-5 кадров в секунду, но 1,2 блоков со скоростью 60 кадров в секунду.

Прежде всего, ускорение уменьшается на GRAVITY * time for the last frame.Если у-позиция меньше 0,15, игрок начинает новый прыжок (yAcceleration установлен на JUMP_POWER).

private static final float GRAVITY = 9;
private static final float JUMP_POWER = 4.4f; 
private static final float TOLERANCE = 0.15f;


private float yAccleration;
private float positionY;

//delta is in seconds
private void update(float delta) {
    yAccleration -= GRAVITY * delta;


    if(positionY <= TOLERANCE) {
        yAccleration = JUMP_POWER;
    } 


    float newYPosition = positionY + yAccleration * delta;
    if(newYPosition > 0) positionY = newYPosition;

}

Это код, который я использую для вызова update()в моем тестовом примере:

final float fps = 60;
final float deltaSeconds = 1f / fps;
while(true) {
    update(deltaSeconds);
    Thread.sleep((int) Math.round(deltaSeconds * 1000));
} 

Что мне нужно изменить, чтобы сделать мой алгоритм независимым от FPS?

1 Ответ

0 голосов
/ 01 июня 2019
final float fps = 60;
final float deltaSeconds = 1f / fps;

Когда я прочитал это, это был "WTF" сразу. Вы не можете предполагать, что дельта будет 1/60 секунды. Более того, НЕ БУДЕТ!

1/60 секунды - это просто ваше время ожидания. А как насчет расчета? Как насчет времени, необходимого для фактического получения текущего времени? Как насчет перерисовки? Все это имеет значение!

Гарантировано использование фиксированной нереальной дельты, просто рассчитайте фактическое время на каждой итерации.

final float fps = 60;
final float deltaSeconds = 1f / fps;
float t0=System.currentMilisecond();
while(true) {
    float t=Sytem.currentMiliseconds();
    float delta=t-t0;
    t0=t;
    update(delta);
    Thread.sleep((int) Math.round(deltaSeconds * 1000));
} 

Вы можете попытаться увеличить частоту кадров, но вам всегда нужно вычислять фактическую разницу во времени.

...