Безопасно ли использовать Sleep () в игровом цикле (в Windows)?

27

Безопасно ли использовать функцию Sleep () в Windows в игровом цикле (C ++)? Я хочу иметь фиксированную частоту кадров.

hemogoblin
источник
Вам необходимо уточнить, что вы подразумеваете под «безопасным». Конечно это безопасно и не собирается портить память или взрывать плееры ПК.
Кромстер говорит, что поддерживает Монику

Ответы:

32

Нет, это не так. Сон гарантирует только минимальное время для сна, но на самом деле он может спать в течение любого произвольного промежутка времени. Разрешение таймера (установленное с помощью timeBeginPeriod) также важно для него, и даже если вы используете что-то другое (например, QueryPerformanceCounter) для своего таймера, вам все еще нужен timeBeginPeriod для управления Sleep.

Итак, в заключение:

  • Время для сна является только гарантированным минимумом, а фактическое время сна может быть выше.
  • Чувствителен к значению, установленному (или не заданному) через timeBeginPeriod.

Единственный разумный вариант использования Sleep - это если вы хотите уменьшить загрузку процессора, например, для мобильных устройств. Даже тогда вы будете использовать Sleep (1); использование его для управления частотой кадров не является подходящим способом.

Включение vsync, вероятно, является одним из распространенных способов получения фиксированной частоты кадров, но даже в этом случае разное оборудование будет работать с разной частотой обновления, и вы не сможете иметь постоянную фиксированную частоту кадров на разных компьютерах (это зависит от того, какое оборудование ты нацеливаешься конечно).

На данный момент необходимо упомянуть эту статью: Gaffer On Games - исправь свой временной шаг! , Здесь описаны шаги, необходимые для получения последовательного временного шага в симуляции.

Максимус Минимус
источник
Огромное спасибо за ссылку. До сих пор я обычно использовал подход с переменным временным шагом, описанный в статье.
Иван Вучица,
Сон также опасен на машинах с включенным быстродействием Intel.
waterwizard11
«но это может на самом деле спать в течение любого произвольного количества времени за это». Ну, это должно быть доказано, я думаю ... Никогда не видел никаких доказательств этого, поэтому я думаю, что это одно из тех "определений". Хороший ответ, и да, вы не можете (даже если он был точным) использовать любой вид Sleep для установки фиксированной частоты кадров (хорошо, что вы можете, но для этого вам нужен высокоточный таймер).
Вальмонд,
2
По MSDN - «Обратите внимание, что готовый поток не гарантированно запускается немедленно. Следовательно, поток может не запускаться до тех пор, пока не истечет время ожидания». Правда, я никогда не видел, чтобы это произошло, но в то же время, если это задокументировано как возможное, я бы определенно не полагался на то, что это никогда не произойдет.
Максимус Минимус
1
Стоит упомянуть, я думаю, что это будет относиться к "... если вы хотите уменьшить использование процессора ...": nanobit.net/doxy/quake3/win__main_8c-source.html <- соответствующий код начинается с 01224
user_123abc
16

Краткий ответ: нет, это не так.

Чтобы иметь фиксированную частоту кадров, вы должны вызвать определенную функцию обратного вызова, которая вызывает определенную частоту кадров. Очевидно, что если вы не знаете, сколько времени займет одна итерация в цикле, вы не сможете установить фиксированное время ожидания.

GLUT предоставляет glutTimerFunc () , которая, если вы программируете в OpenGL, является нужной вам функцией. Взгляните на этот пример или этот .

Дэн
источник
1
«По крайней мере, через миллисекунды мсек OpenGLUT будет вызывать обратный вызов» - чем это отличается от Sleep?
Кромстер говорит, что поддерживает Монику