Чи повинен цикл гри базуватися на фіксованих або змінних часових кроках? Чи завжди хтось вищий, чи правильний вибір залежить від гри?
Змінений крок часу
Оновлення фізики передаються аргументом "час, що минув з моменту останнього оновлення", і, отже, залежать від частоти кадрів. Це може означати проведення розрахунків як position += distancePerSecond * timeElapsed
.
Плюси : плавний, простіший в кодуванні
Мінуси : недетермінований, непередбачуваний на дуже маленьких або великих кроках
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
Фіксований крок часу
Оновлення можуть навіть не приймати "минув час", оскільки вони припускають, що кожне оновлення відбувається протягом певного періоду часу. Розрахунки можуть проводитися як position += distancePerUpdate
. Приклад включає інтерполяцію під час візуалізації.
Плюси : передбачуваний, детермінований (легше синхронізувати мережу?), Чіткіший код обчислення
Мінуси : не синхронізований для моніторингу v-синхронізації (спричиняє хвилясту графіку, якщо ви не інтерполюєте), обмежена максимальна частота кадрів (якщо ви не інтерполюєте), важко працювати в рамках, які припустимо змінні кроки часу (наприклад, Pyglet або Flixel )
while( game_is_running ) {
while( GetTickCount() > next_game_tick ) {
update();
next_game_tick += SKIP_TICKS;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
render( interpolation );
}
Деякі ресурси
- Гаффер на ігри: виправте свій крок!
- Стаття про ігровий цикл deWitter
- FPS Quake 3 впливає на фізику стрибків - мабуть, причина Doom 3 заблокована кадром до 60 кадрів в секунду?
- Для Flixel потрібен змінний часовий крок (я думаю, це визначається Flash), тоді як Flashpunk дозволяє обидва типи.
- Посібник Box2D § Моделювання світу Box2D пропонує використовувати постійні кроки в часі.