Я новичок в разработке игр. Для того, чтобы узнать, я воссоздаю эту игру на платформе Android. Вы можете посмотреть игровое видео по ссылке выше. Это простая игра.
Я прочитал много статей о начале разработки игр. Почти все они рекомендуют использовать игровой цикл в отдельном потоке, что имеет смысл для других игр. Тем не менее, для этой конкретной игры мне нужно начать отдельный поток?
Ответы:
Игровой цикл обычно рекомендуется, потому что он прост . Практически любая игра может быть должным образом разработана и запущена с использованием цикла, и для большинства игр требуется, чтобы она функционировала должным образом.
Например, большинство физических движков требуют надежных постоянных обновлений для правильного моделирования. Анимации и другой динамический контент и графика должны обновляться при каждом изменении и т. Д. Ака-то, что вы получаете практически бесплатно с помощью цикла.
Теперь имейте в виду, что ваш цикл не должен выполняться в отдельном потоке. Фактически, для простоты большинство игр запускают цикл в главном потоке. Даже мои проекты Android следуют этому принципу.
Теперь реальный вопрос здесь в том, какую альтернативу вы предлагаете? Если у вас есть другая идея о том, как надежно получать входные данные, делать обновления и рисовать подходящие для вас кадры, тогда продолжайте! В противном случае игровой цикл может быть самым простым способом начать работу.
источник
Нет , отдельная тема не требуется. Если вы не делаете что-то слишком интенсивное (что не похоже на тот случай в игре, которую вы показали нам), все может быть сделано в главном потоке.
Второй поток необходим, если вы выполняете большую обработку или иным образом испытываете проблемы с пользовательским интерфейсом / вводом, который перестает отвечать на запросы. Например, в более сложных играх вы не хотите, чтобы пользовательский интерфейс / ввод перестали отвечать, когда ИИ рассчитывает свой следующий ход. Поскольку ваша игра в основном реагирует на ввод данных пользователем и обновляет визуальные эффекты, второй поток не требуется.
Отвечая на вопрос «Требуется ли цикл»?
Нет , но альтернативы сложнее, сложнее в реализации и используются редко.
Игры по определению являются интерактивными. Как минимум, это ожидание ввода и обновление вывода. Самый простой способ сделать это с помощью цикла. Для этого не нужно создавать новую ветку.
Несмотря на то, что игра, о которой вы упомянули, выглядит простой, она имеет интерактивные визуальные эффекты и звуки и постоянно обновляет их, основываясь на пользовательском вводе.
Альтернатив для игрового цикла тоже не много. Может быть возможна какая-то система, основанная на прерываниях. Однако такие системы увеличивают сложность и уменьшают другие факторы, такие как детерминизм. Есть причина, по которой игровые циклы настолько распространены, что их легко реализовать, легко понять, они гибки и отлично справляются со своей задачей.
источник
Ответ на актуальный вопрос (должен ли игровой цикл быть в отдельной теме):
Причина, по которой люди часто рекомендуют использовать отдельный поток, заключается в том, что они не хотят, чтобы тяжелая обработка мешала интерактивности пользовательского интерфейса. Вы единственный, кто может сказать, нужна ли отдельная тема для вашей игры. От движка и фреймворка полностью зависит, может ли основной игровой цикл в вашем нынешнем дизайне влиять на время отклика пользовательского интерфейса. Думаю, вы обычно предполагаете, что это не будет (в небольших проектах), если у вас нет причин думать иначе.
Другая причина хранить код в отдельных потоках - это сохранять код модульным и простым. Смешивание двух не связанных между собой частей кода часто может привести к тому, что код станет менее читаемым и поддерживаемым в долгосрочной перспективе.
Должен ли игровой цикл выполняться в отдельном потоке? Возможно. Если есть проблема со временем отклика или кодом, и вам нужно ответить на несколько элементов пользовательского интерфейса, независимо от интенсивной обработки, или вы просто хотите разбить код на конкретные задачи, которые выполняются одновременно по соображениям проектирования, то используйте его. Тем не менее, это считается передовой практикой программирования.
Простой, но, возможно, не лучший пример для иллюстрации - игра для двух игроков. Возможно, вы захотите запустить два экземпляра класса, который обрабатывает ввод пользователя и преобразует изменения состояния в экземпляре персонажа игрока.
Некоторые фреймворки поощряют / требуют от вас использовать систему, основанную на событиях / прерываниях, как ActionScript3.0. В этом случае код цикла обычно переходит к
OnEnterFrame
событию или чему-то подобному, что происходит 20 - 60 или 120 раз в секунду.Ответ на оригинальный вопрос (нужен ли основной цикл):
Все сводится к счетчику программ . Если вы создаете игру, которая будет работать дольше заданного промежутка времени и не будет генерировать код в процессе работы, вам нужно будет попросить компьютер вашего пользователя повторить некоторые инструкции, которые он уже обработал, и что, возможно, изменится в Тем временем это состояние (значения хранятся в объектах и глобалах игры).
Поскольку вы знаете, что вам нужно будет повторять инструкции, есть несколько способов выполнить эту задачу и постоянно обрабатывать одни и те же инструкции. Все эти методы включают перемещение счетчика программы обратно к текущей соответствующей инструкции. Наиболее распространенные операторы потока управления, которые вызывают повторение кода, называются циклами, другой -
goto
оператор, который редко используется в современном коде и имеет подобный эффект в этом случае (совершенно не относится к вам).Итак, чтобы ответить на ваш предыдущий вопрос, вам нужен цикл? Да, вы делаете.
источник
Просто добавьте к ответам других людей то, о чем никто явно не упомянул: если вы рискуете запустить игровой цикл во втором потоке, и он перестает отвечать, вы рискуете, что ОС закроет ваше приложение. Вот почему рекомендуется использовать отдельный поток. Следовательно (например) NDK's
native_app_glue.c
/.h
порождает отдельный поток для вашего цикла.источник