Нещодавно я прочитав цю статтю про ігри Петлі: http://www.koonsolo.com/news/dewitters-gameloop/
І рекомендована остання реалізація мене глибоко бентежить. Я не розумію, як це працює, і це виглядає як повний безлад.
Я розумію принцип: оновлюйте гру з постійною швидкістю, і все, що залишиться, надайте гру якомога більше разів.
Я вважаю, що ви не можете використовувати:
- Отримайте внесок за 25 кліщів
- Візуалізація гри на 975 кліщів
Підхід, оскільки ви отримаєте вклад для першої частини другої, і це буде дивно? Або це те, що відбувається в статті?
По суті:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
Як це навіть справедливо?
Припустимо його значення.
MAX_FRAMESKIP = 5
Припустимо next_game_tick, якому було призначено моменти після ініціалізації, перед тим, як сказати основний цикл гри ... 500.
Нарешті, оскільки я використовую SDL та OpenGL для своєї гри, при цьому OpenGL використовується лише для візуалізації, припустимо, що GetTickCount()
повертає час з часу виклику SDL_Init, який він робить.
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
Джерело: http://www.libsdl.org/docs/html/sdlgetticks.html
Автор також припускає це:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
Якщо ми розширимо отримане while
твердження:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750, тому що минув час з моменту next_game_tick
призначення. loops
дорівнює нулю, як ви бачите у статті.
Отже, ми ввели цикл while, давайте зробимо певну логіку і приймемо деякий вклад.
Ядаядаяда.
Наприкінці циклу while, який, нагадаю, знаходиться в нашому головному циклі гри:
next_game_tick += SKIP_TICKS;
loops++;
Давайте оновимо, як виглядає наступна ітерація коду while
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000, тому що минув час, щоб отримати введення та робити речі, перш ніж ми дійшли до наступного зменшення циклу, де GetTickCount () відкликається.
540 тому, що в коді 1000/25 = 40, отже, 500 + 40 = 540
1 тому, що наш цикл повторився один раз
5 , ви знаєте чому.
Отже, оскільки цей цикл Хоча ЧИСТО залежно від цього, MAX_FRAMESKIP
а не призначений, TICKS_PER_SECOND = 25;
як гра повинна працювати навіть правильно?
Мене не здивувало, що коли я реалізував це у своєму коді, я міг би правильно додати, оскільки я просто перейменував свої функції на обробку вводу користувача та малював гру на те, що автор статті має у своєму прикладі коду, гра нічого не робила .
Я помістив fprintf( stderr, "Test\n" );
всередину цикл while, який не надрукується, поки гра не закінчиться.
Як цей ігровий цикл працює 25 разів на секунду, гарантовано, при цьому відображається так швидко, як це можливо?
Для мене, якщо я не пропускаю чогось ВЕЛИЧЕГО, це виглядає як ... нічого.
І хіба не ця структура цього циклу, хоча він працює 25 разів на секунду, а потім оновлює гру саме те, про що я згадував на початку статті?
Якщо це так, чому ми не могли б зробити щось просте на кшталт:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
І розраховуйте на інтерполяцію іншим способом.
Пробачте за моє надзвичайно довге запитання, але ця стаття принесла мені більше шкоди, ніж користі. Зараз я сильно розгублений - і не знаю, як реалізувати правильний цикл гри через усі ці виникаючі питання.