Существует два "обычных" способа "контролировать" частоту кадров, и ни один не так прост.
Первым и более контролирующим из двух, и что-то, что обычно является необязательным, является VSync. Это заставляет видеокарту выдвигать новый кадр только после обновления монитора. Многие мониторы обновляются с частотой 60 Гц, поэтому вы, как правило, получаете 60 кадров в секунду.
Это очень хорошо работает для cap частоты кадров для отслеживания частоты обновления, но когда частота кадров падает ниже частоты обновления, это приводит к следующему кратному. Таким образом, когда частота кадров начинает немного падать, вы теряете немного потенциального времени рендеринга, потому что оно равно 60, затем 30, затем 20 и т. Д.
(немного информации о vsync в DirectX и OpenGL )
Второй обычно используемый метод (с опционально добавленным vsync) не ограничивает частоту кадров. Вместо этого скорректируйте свой код для обработки различий. Это гораздо более гибко в долгосрочной перспективе и, как правило, лучше кодирует, IMO, и намного проще, чем пытаться форсировать определенное количество FPS.
Предполагая, что у вас есть простой цикл рендеринга, он начинает выглядеть примерно так:
while ( gameloop )
{
float framedelta = ( timeNow - timeLast )
timeLast = timeNow;
for each ( GameObject object in World )
{
object->Animate(framedelta);
object->Move(speed * framedelta)
}
render();
}
Вы хотите посмотреть разницу во времени / прошедшее время / дельта и работать оттуда. Разрешите масштабировать частоту кадров в зависимости от оборудования и настроек (слишком много вариантов, чтобы вы могли предсказать или обработать даже половину), и заставить вашу игру работать с этим вместо того, чтобы управлять им. Намного проще, гибче и стабильнее на практике.