LWJGL работает медленнее при более высоком FPS? (Дельта)

Недавно я начал разрабатывать свои собственные игровые движки для развлечения. Я реализовал метод загрузки моделей Blender .OBJ из файлов и успешно их визуализирую. Однако при проведении стресс-теста я столкнулся с необычным затруднением с моей системой fps, основанной на дельта-времени. При скорости 1500 кадров в секунду мне требуется 4 секунды, чтобы перевести взгляд с одного конца стены моделей на другой. Однако, если я ограничу FPS на уровне 120FPS, мне потребуется всего 0,84 секунды, чтобы посмотреть с одного конца стены на другой. По мере того, как я исследовал дальше, казалось, что на самом деле скорость движения в игре уменьшается с увеличением FPS.

Вот мой класс таймера:

class Timer
{

    long lastFrame;

    int fps;
    long lastFPS;

    int delta;

    int fpsToReturn;



    public Timer()
    {
        lastFPS = getTime();
    }

    public long getTime()
    {
        return (Sys.getTime() * 1000) / Sys.getTimerResolution();
    }

    public int getDelta()
    {
        long time = getTime();
        delta = (int) (time - lastFrame);
        lastFrame = time;

        return delta;
    }

    public void updateFPS()
    {
        if (getTime() - lastFPS > 1000)
        {           
            fpsToReturn = fps;

            fps = 0;
            lastFPS += 1000;
        }
        fps++;
    }

    public int getFPS()
    {
        return fpsToReturn;
    }
}

И, конечно же, движение — это что-то вроде:

camera.rotX += (0.5 * timer.getDelta());

У кого-нибудь есть идеи? Это то, как должно работать дельта-время? При работе со скоростью 16 кадров в секунду он возвращает около 65, при 120 кадрах в секунду Delta возвращает около 8-9, в то время как без ограничения FPS всегда возвращает 0 или 1, если это имеет значение или помогает вам определить, что что-то не так с неограниченным FPS. Я очень ценю любую помощь, спасибо, ребята.


person TheNewGuy    schedule 25.10.2014    source источник


Ответы (1)


Решил свой вопрос и рад, что научился в процессе.

Моя проблема, которую я обнаружил позже, когда реализовывал угловое движение, заключалась в том, что я использовал метод getDelta() и getFPS() каждый раз, когда мне это нужно было больше, чем один раз за кадр, что сбрасывало дельта-переменную. Я решил проблему, используя статическую переменную, одну для FPS и одну для Delta, и обновляя каждую переменную в конце каждого кадра.

Псевдокод:

public static double globalDelta;

while(nextFrame) //Loops once per frame
{
    updateGame();

    globalDelta = calculateDelta();
}
person TheNewGuy    schedule 26.10.2014