Я делаю некоторые предположения здесь.
Предположим, у вас есть модель, для которой вы хотите показать состояние.Возможно, вы захотите максимизировать время, затрачиваемое процессором на разработку модели, а не на рендеринг.
Таким образом, вы фиксируете целевую частоту кадров, например, 25 кадров в секунду.
Опять же, предположим, что вы оптимизировали рендеринг так, чтобыэто можно сделать менее чем за 0,04 секунды.
Таким образом, вы можете захотеть что-то вроде (псевдокод):
Time lastRendertime = now();
while(forever)
{
Time current = now();
if ((current - lastRenderTime > 0.04))
{
renderEverything();
lastRenderTime = current;
}
else
{
evolveModelABit();
}
}
Конечно, у вас, вероятно, есть обработчик ввода, чтобы разбитьпетля.Обратите внимание, что этот подход предполагает, что вы не хотите, чтобы эволюция модели зависела от истекшего реального времени.Если вы это сделаете, и пусть игры это сделают, то передайте время current
на evolveModelABit();
.
Для функций времени в Windows вы можете использовать:
LARGE_INTEGER frequency; // ticks per second
LARGE_INTEGER t1; // ticks
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&t1);
Обратите внимание, чтоэтот подход подходит для моделирования научного типа.Эволюция модели не будет зависеть от частоты кадров, рендеринга и т. Д., И дает тот же результат очень быстро.
Для игры, как правило, есть толчок к увеличению fps.Это означает, что основной цикл имеет вид:
Time lastRendertime = now();
while(forever)
{
Time current = now();
evolveModelABit(current, lastRenderTime);
renderEverything();
lastRenderTime = current;
}