Я пытался создать геймплей с частотой кадров, зависящей от скорости его итераций. Чтобы добиться этого, я хотел использовать таймер для конкретной платформы, который (в случае окон) использовал функцию 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 чем-то, что вы могли бы использовать в игровом цикле (об этом было много сказано), или мне следует подумать о другой функции?