Это мой код игрового цикла:
while (shouldUpdate)
{
timeSinceLastUpdate = 0;
startTime = clock();
while (timeAccumulator >= timeDelta)
{
listener.handle();
em.update();
timeAccumulator -= timeDelta;
timeSinceLastUpdate += timeDelta;
}
rm.beginRender();
_x->draw();
rm.endRender();
timeAccumulator += clock() - startTime;
}
Он работает почти идеально, но у него есть некоторое дрожание, несколько раз в секунду вместо _x (тестовый объект, который все, что он делает в обновлении, это x++) перемещается на 1 пиксель вправо, он фактически перемещается на 2 пикселя вправо и это заметный эффект задержки/джиттера. Я предполагаю, что clock() недостаточно точен. Итак, что я могу сделать, чтобы улучшить этот игровой цикл?
Если это имеет значение, я использую SDL и SDL_image.
EDIT: ничего не изменилось после того, как мы сделали что-то более точное, чем часы. НО, что я понял, так это то, что все это благодаря timeDelta. Вот как было определено timeDelta, когда я сделал этот пост:
double timeDelta = 1000/60;
но когда я определил это как что-то другое, возясь...
double timeDelta = 16.666666;
Я заметил, что в первые несколько секунд игра запустилась, она была гладкой, как по маслу. Но всего через несколько секунд игра сильно заикалась, а затем снова стала плавной и повторилась. Чем больше 6 (или что-то после . на самом деле) я добавлял, тем дольше игра изначально была гладкой и тем сильнее лаг, когда это происходило. Кажется, атакуют плавающие ошибки. Так что я могу сделать тогда?
EDIT2: я перепробовал так много вещей, что это даже не смешно... может кто-нибудь помочь мне с математической частью цикла? Так как это то, что вызывает это...
РЕДАКТИРОВАТЬ 3: Я отправил тестовую программу некоторым людям, некоторые сказали, что она была идеально гладкой, а другие сказали, что она была дрожащей, как я ее описал. Для всех, кто захочет протестировать это, вот оно (src): https://www.mediafire.com/?vfpy4phkdj97q9j
EDIT4: я изменил ссылку на исходный код.
std::chrono
для C++, либо проверьте это для C для самых точных таймеров. - person shauryachats   schedule 16.07.2015clock()
для таймера в чем-то вроде игры. - person RamblingMad   schedule 16.07.2015timeDelta
не должно не быть константой. Вы можете подождать, пока оно не станет больше или равно определенному значению, чтобы получить ограничение частоты кадров, но оно все равно должно рассчитываться для каждого кадра. - person RamblingMad   schedule 17.07.20151000/60
— целочисленное деление, в результате получается16
. Если вы хотите лучший дубль, то используйте1000.0/60
. Но лучше было бы предложение CoffeeandCode об ограничении частоты кадров. - person Teepeemm   schedule 22.07.2015