Является ли timeGetTime хорошим способом измерить время для геймплея? - PullRequest
0 голосов
/ 25 января 2019

Я пытался создать геймплей с частотой кадров, зависящей от скорости его итераций. Чтобы добиться этого, я хотел использовать таймер для конкретной платформы, который (в случае окон) использовал функцию timeGetTime (https://docs.microsoft.com/en-us/windows/desktop/api/timeapi/nf-timeapi-timegettime), чтобы вычислить, сколько времени прошло с последней итерации. Но я обнаружил, что это время вызвать эту функцию уже довольно много (для компьютера). Теперь мне интересно, если это правильный подход.

Я создал простой тест, который выглядит следующим образом:

Timer timer();
    for (int i=0; i < 60; i++)
        cout << timer->get_elt() << endl;
    delete timer;

Класс таймера выглядит следующим образом: (begin - DWORD)

Timer::Timer()
{
    begin = timeGetTime();
}
int Timer::get_elt()
{
    return timeGetTime() - begin;
}

Не очень интересно, но вот пример результата:

0 0 1 3 4 14 15 15 15 16 16 17 17 17 17 18 19 19 19 19 20 20 20 20 20 21 21 21 21 21 22 22 22 22 22 22 23 23 23 25 38 39 39 55 56 56 66 68 68 69 71 71 72 73 73 73 73 73 74 74

Я ожидал, что это займет максимум 10 миллисекунд, но в среднем это заняло около 64. Больше всего меня удивило то, насколько непредсказуемыми были результаты. Иногда он печатает до 7 раз одно и то же число, тогда как в другое время между итерациями возникает разрыв в 12 миллисекунд. Я понимаю, что это также потому, что таймер не точен, но все же. Насколько я знаю, ваш компьютер должен выполнить эту программу так быстро, как только возможно, это правда? Если вы хотите запустить свою игру, скажем, со скоростью 60 кадров в секунду, у вас будет около 16 миллисекунд на каждый цикл, и если вызов одного таймера занимает в среднем около 2 миллисекунд каждый раз, и вам все равно нужно обрабатывать ввод, обновление и рендеринг , Как это вообще возможно? Итак, что мне здесь делать, является ли timeGetTime чем-то, что вы могли бы использовать в игровом цикле (об этом было много сказано), или мне следует подумать о другой функции?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Таймеры от Windows Multimedia API - хороший выбор для анимации, игр и т. Д. Обладают наибольшей точностью на платформе Windows. Qt использует и квалифицирует эти таймеры также как точные.

http://doc.qt.io/qt-5/qt.html#TimerType-enum

В Windows Qt будет использовать мультимедийный таймер Windows (если доступно) для Qt :: PreciseTimer и обычных таймеров Windows для Qt :: CoarseTimer и Qt :: VeryCoarseTimer.

0 голосов
/ 25 января 2019

Я бы предложил использовать вместо QueryPerformanceCounter

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx

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