Как сделать скорость (частоту кадров вашей игры) одинаковой на разных ПК? - PullRequest
2 голосов
/ 03 марта 2010

В нашей школе принято создавать игры как классные проекты для реализации различных концепций, которые мы изучаем на наших уроках информатики. Теперь мы разработали наши игры на нашей машине, и все, кажется, работает нормально, скорость игры нормальная и так далее. Теперь, когда мы пытаемся протестировать наши игры на компьютере нашей школы или когда наш профессор тестирует наши игры на своем собственном компьютере, скажем, его компьютер намного мощнее, чем тот, в котором мы разрабатывали наши игры, скорость игры резко меняется. .. В большинстве случаев анимация игры происходит быстрее, чем ожидалось. Итак, мой вопрос, как вы можете предотвратить подобные проблемы в игровых приложениях? И да, мы используем Java. Обычно мы используем пассивный рендеринг в качестве метода рендеринга в большинстве приложений, которые мы создали. tnx заранее!

Ответы [ 4 ]

6 голосов
/ 03 марта 2010

Вы не должны полагаться на скорость рендеринга для своей игровой логики. Вместо этого следите за временем, проведенным с последнего логического шага в игре до текущего. Затем, если затраченное время превысило определенную сумму, вы выполняете игровой шаг (в редких случаях, когда компьютер работает так медленно, что должно было произойти два шага, вы можете придумать разумное решение, чтобы убедиться, не отстает).

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

Какой-то псевдокод:

// now() would be whatever function you use to get the current time (in
// microseconds or milliseconds).
int lastStep = now();
// This would be your main loop.
while (true) {
    int curTime = now();

    // Calculate the time spent since last step.
    int timeSinceLast = curTime - lastStep;

    // Skip logic if no game step is to occur.
    if (timeSinceLast < TIME_PER_STEP) continue;

    // We can't assume that the loop always hits the exact moment when the step
    // should occur. Most likely, it has spent slightly more time, and here we
    // correct that so that the game doesn't shift out of sync.
    // NOTE: You may want to make sure that + is the correct operator here.
    //       I tend to get it wrong when writing from the top of my head :)
    lastStep = curTime + timeSinceLast % TIME_PER_STEP;

    // Move your game forward one step.

}
2 голосов
/ 03 марта 2010

Вы можете найти эту статью интересной: Исправьте ваш временной шаг .

0 голосов
/ 03 марта 2010

Вы также можете использовать javax.swing.Timer для управления скоростью анимации. В этом ответе .

есть тривиальный пример.
0 голосов
/ 03 марта 2010

Лучший способ добиться переносимости - это ввести несколько команд Thread.sleep () с одинаковой задержкой между рисованием каждого кадра. Тогда результаты будут единообразными для каждой системы. Поскольку вы используете пассивный рендеринг, то есть рисование анимации непосредственно в рисовании, вызов Thread.sleep () оттуда может быть не лучшей идеей ...

Может быть, вы могли бы просто обновить переменные, которые ваша анимация зависит от каждой пары миллисекунд?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...