Чи безпечно використовувати Sleep () у циклі ігор (у Windows)?


27

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


Вам потрібно уточнити, що ви маєте на увазі під «безпечним». Звичайно, це безпечно і не збирається пошкоджувати пам'ять або підірвати ПК гравців.
Кромстер каже, що підтримують Моніку

Відповіді:


32

Ні це не так. Сон гарантує лише мінімальний час для сну, але він фактично може спати протягом будь-якої довільної кількості часу. Ваша роздільна здатність таймера (встановлена ​​через timeBeginPeriod) також важлива для цього, і навіть якщо ви використовуєте для свого таймера щось інше (наприклад, QueryPerformanceCounter), вам все одно потрібен timeBeginPeriod для контролю сну.

Отже, підсумовуючи:

  • Час для сну - лише гарантований мінімум, а фактичний час сну може бути більшим.
  • Набір чутливих до значення (або не встановлений) через timeBeginPeriod.

Єдиним розумним випадком використання режиму сну є те, якщо ви хочете зменшити використання процесора, наприклад, для мобільних пристроїв. Вже тоді ви використовуєте сон (1); використовувати його для управління частотами кадрів - це не шлях.

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

На даний момент часу потрібно згадати цю статтю: Gaffer On Games - Fix Your Timetep! . Це описує кроки, необхідні для отримання послідовного часового кроку у вашому моделюванні.


Величезне спасибі за посилання. До цих пір я зазвичай використовував підхід "змінний графік", описаний у статті.
Іван Вучиця

Сон також небезпечний для машин, на яких увімкнено швидкість Intel.
waterwizard11

"але насправді це може спати протягом будь-якої довільної кількості часу." Ну, це треба довести, я думаю ... Ніколи не бачив жодного доказу цього, тому я думаю, що це одне з тих "визначень". Хоча гарна відповідь, і так, ви не можете (навіть якщо це було, як це є точним) використовувати будь-який тип сну, щоб встановити фіксовану частоту кадрів (ну ви можете, але для цього вам потрібен таймер високої точності).
Валмонд

2
За MSDN - "Зауважте, що готовий потік не гарантується запустити негайно. Отже, потік може не запускатися до деякого часу після того, як пройде інтервал сну". Правда, я ніколи не бачив, щоб це сталося, але в той же час, якщо це буде задокументовано як можливо, я точно не покладався б на те, щоб це ніколи не відбувалося.
Максим Мінімус

1
Варто зазначити, я думаю, що це стосується "... якщо ви хочете зменшити використання процесора ...": nanobit.net/doxy/quake3/win__main_8c-source.html <- відповідний код починається з 01224
user_123abc

16

Коротка відповідь: ні, це не так.

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

GLUT забезпечує glutTimerFunc () , тобто, якщо ви програмуєте в OpenGL, потрібну вам потрібну функцію. Погляньте на цей приклад , чи на цей .


1
"Через щонайменше секунди мілісекунди OpenGLUT буде викликати зворотній виклик" - чим це відрізняється від Sleep?
Кромстер каже, що підтримують Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.