Рамкове обмеження


9

Найуспішніші конкурентоспроможні ігрові движки люблять id Tech, GoldSrc, Sourceі такі , дозволяють обмеження кадрових частоти.

Ви можете грати з 30, 60, 99, 72, 68 і т. Д. Коротше кажучи, ви можете керувати ним і керувати шапкою.

Мені було цікаво, як я обмежую частоту кадрів?

Не цікавиться кодом, а теорією.


Щось із цікавості, який сенс у цьому, крім звільнення циклів для інших процесів?
3Dave

1
@DavidLively, подумайте про ноутбуки, які дуже легко перегріваються при дуже високій частоті кадрів, тоді як з кришкою в 60 кадрів в секунду (більше все одно марно, навіть 60 трохи більше, 40 потрібно зробити) вони можуть контролювати температуру набагато краще.

Для конкурентних ігор найкраще мати рівну частоту кадрів замість шипів між 60 і 100 кадрів в секунду, оскільки іноді деякі дії залежать від частоти кадрів і не залежать від часу, однакова частота кадрів дозволяє відчути ці дії. Зауважте, що якщо ви включите VSync, ваша гра завжди має максимальну кількість кадрів в секунду, рівну вашій частоті оновлення, оскільки (драйвер про це дбає).
Рой Т.

Відповіді:


7

Теорія така: Перевірте, коли ви востаннє оправляли кадр, і якщо ще не час намалювати ще один кадр, тоді не робіть, і чекайте, поки він з'явиться.


8

Скажімо, ви хочете обмежити частоту кадрів до 60 кадрів в секунду, це означає, що кожен кадр має час відтворення 1 / 60s = 16,67ms (закруглено)

Для обмеження частоти кадрів ви просто перевіряєте час на початку циклу гри, а потім можете порівняти його з часом у кінці ігрового циклу: якщо різниця менше 16,67 мс, ви повинні затримати цей час.

Один із способів зробити це - використовувати:

sleep(waittime)

Однак, оскільки sleep(x)отримує нитку протягом мінімум xмілісекунд, ви точно не знаєте, чи отримаєте ви керування назад у часі.

Кращим способом було б використання:

while(timediff < 16.67ms){ sleep(0); }

Це дає нитку і запитує контроль якнайшвидше.

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

Пам’ятайте, що планувальник ОС завжди може забрати контроль у вашої нитки, тому будьте готові до певних коливань.


"1/60-ті", щоб бути зрозумілим. :)
Річард Марскелл - Дракір

Це рішення справді погано. Якщо увімкнено vsync або ОС вирішить робити щось, частота кадрів буде сильно коливатися.
Тара

@Dudeson Чому це погано? (це техніка, яка використовується в Quake3 btw). Якщо FPS нижче 60, цикл просто пропускається. Таким чином, він підтримує ваш FPS максимально високим, але ніколи вище 60.
Рой Т.

@RoyT. Цікаво ... Звідки ви взяли цю інформацію? З вихідного коду? Крім того, я кажу, що чекати в циклі це погано, тому що саме так я це зробив у своєму двигуні, і це заподіює мені багато болю. Проблема полягає в тому, що при включенні vsync (у драйвері графічного процесора) ви отримуєте багато крапель кадру, якщо додатково намагаєтесь обмежити частоту кадрів у своєму коді, тому що ваш timinig не буде ідеальним для кожного кадру. Я просто говорю про проблеми vsync. Без vsync це не проблема. І я не впевнений, чи було vsync такий самий вид угоди в Quake 3 дні, як сьогодні.
Тара

@Dudeson хтось інший вказав на це мені певний час тому, тому що я хвилювався за напружене очікування та сон. Тепер я бачу, що ви можете коливатися між 30 кадрів в секунду і 60 кадрів в секунду, коли v-синхронізація увімкнена, якщо трохи не пропустити її. Але я думаю, що це відбувається з будь-якою технікою (хіба це не те, що FreeSync намагається полегшити). Я думаю, що обмежена частота кадрів за кодом або через те, що ваш комп'ютер не може відображатись зі швидкістю 60 кадрів в секунду, завжди матиме цю проблему :)
Roy T.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.