Как мне написать основной игровой цикл? [закрыто]

130

Как мне написать основной игровой цикл? Какие вещи вы должны делать в игровом цикле, и какие вещи вы не должны делать в игровом цикле?

Я написал много из них, но я никогда не читал об игровых циклах. Я уверен, что мог бы значительно улучшить их, но я не уверен, как.

hokiecsgrad
источник
4
Злой ответ: А как насчет использования движка Someones, чтобы сделать этот цикл для Вас? :)
user712092
Вы можете спросить пользователя об общем количестве фреймов, которые он хочет запустить, и использовать цикл for для n-кратного количества буферов.
Угур Гюмюшан

Ответы:

121

Основной игровой цикл решает три основные задачи:

  1. Получить пользовательский ввод
  2. Обновить состояние игры
  3. Нарисуй игру

Простой игровой цикл просто объединяет эти три задачи в один цикл. Это имеет некоторые нежелательные результаты:

  1. Игра работает на разных компьютерах с разной скоростью.
  2. Процессор (может быть излишне) привязан при 100% использовании.
  3. «Состояния игры» / меню отсутствуют или смешаны с кодом игры.
  4. Основной игровой цикл очень длинный и сложный в обслуживании.
  5. Код трудно расширять / переносить на другие платформы.

Расширенные игровые циклы решают проблемы, перечисленные выше. Вот несколько полезных статей:

Для отличного примера игрового цикла взгляните на демонстрационную игру Allegro skater:

  • Код игрового цикла находится в framework.c .
  • Просмотрите полный исходный код здесь .

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

Leftium
источник
1
Да, как я подозревал, я определенно могу сделать улучшения. Хорошо читает. Также спасибо за размещение кода. Приятно видеть реальный игровой код с этим материалом.
Hokiecsgrad
1
Процессор должен застрять на 100% (или больше, как 50%, если у вас есть как минимум 2 ядра). Думаю об этом. Как ты получишь ультрасовременную физику, убийственную графику, если ты сидишь там и говоришь себе: «О, но я не хочу использовать весь процессор». Да, вы должны использовать 100% процессорного времени, если это возможно (это означает многопоточность на современных компьютерах, поэтому очень сложно использовать 100% из 4 ядер все время). Получите максимальную отдачу от машины, на которой вы работаете.
бобобо
5
Позвольте мне добавить: Для настольных программ . На портативном устройстве вы будете сжигать гораздо больше батареи, так что вы будете беспокоиться о 100% использовании.
Бобобобо
1
@ user6003859: я исправил ссылку.
Leftium
1
Еще одна полезная ссылка: gameprogrammingpatterns.com/game-loop.html
brita_
51

Я бы порекомендовал статью Гленна Фидлера о надежной независимости от частоты кадров: « Исправь свой временной шаг! »

(Менее актуально для рассматриваемой темы, но другие статьи в серии также довольно хороши - как и все на его сайте!)

Neverender
источник
Это определенно хорошие статьи. Спасибо за публикацию!
Hokiecsgrad
1
Я рекомендую иметь надежную независимую реализацию с частотой кадров. Все в вашей игре должно быть реализовано как дельта-значение, которое вы периодически обновляете. И это не обязательно должно быть сделано одновременно с переходом к следующему кадру. На самом деле, если вы пропустили фрейм, вы, вероятно, действительно не хотите просто вызывать ваши методы обновления с двойной разницей. Было бы более логичным дважды вызывать ваше обновление с одной и той же дельтой. Определенно потратьте время на изучение проблем с частотой кадров и циклом обновления. Это сэкономит вам время позже.
Деннис Манси
4

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

http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php

Nikwin
источник