Является ли отдельный поток для игрового цикла обязательным для простых игр?

10

Я новичок в разработке игр. Для того, чтобы узнать, я воссоздаю эту игру на платформе Android. Вы можете посмотреть игровое видео по ссылке выше. Это простая игра.

Я прочитал много статей о начале разработки игр. Почти все они рекомендуют использовать игровой цикл в отдельном потоке, что имеет смысл для других игр. Тем не менее, для этой конкретной игры мне нужно начать отдельный поток?

джин
источник
Не уверен, что это дубликат, так как речь идет об Android. Существуют и другие соображения относительно потоков в платформе на основе Java, которые отличаются от этого вопроса.
Шон Мидлдитч

Ответы:

8

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

Например, большинство физических движков требуют надежных постоянных обновлений для правильного моделирования. Анимации и другой динамический контент и графика должны обновляться при каждом изменении и т. Д. Ака-то, что вы получаете практически бесплатно с помощью цикла.

Теперь имейте в виду, что ваш цикл не должен выполняться в отдельном потоке. Фактически, для простоты большинство игр запускают цикл в главном потоке. Даже мои проекты Android следуют этому принципу.

Теперь реальный вопрос здесь в том, какую альтернативу вы предлагаете? Если у вас есть другая идея о том, как надежно получать входные данные, делать обновления и рисовать подходящие для вас кадры, тогда продолжайте! В противном случае игровой цикл может быть самым простым способом начать работу.


источник
Альтернатива, которую я думаю, состоит в том, чтобы обновить экран, используя саму основную нить, поскольку все действия выполняются последовательно - игрок проводит по шарикам одного цвета, затем все затронутые шарики исчезают, оставшиеся шарики падают под действием силы тяжести вместе с заменяющими шариками.
Джин
То есть вы не спрашиваете, нужен ли цикл? Ваше главное беспокойство, если это должно быть в отдельной нити, правильно?
AturSams
1
правильный. мой вопрос о нити, а не петли. для такой простой игры (хотя мне повезет, что я смогу создать такую ​​игру), нужно ли создавать новую тему или все можно сделать в основной теме?
Джин
1
Нет, это не обязательно. Пока у вас есть цикл , нет необходимости создавать второй цикл .
@jin, тебе действительно следует сменить название и то, как ты пишешь свой вопрос.
валлентин
5

Нет , отдельная тема не требуется. Если вы не делаете что-то слишком интенсивное (что не похоже на тот случай в игре, которую вы показали нам), все может быть сделано в главном потоке.

Второй поток необходим, если вы выполняете большую обработку или иным образом испытываете проблемы с пользовательским интерфейсом / вводом, который перестает отвечать на запросы. Например, в более сложных играх вы не хотите, чтобы пользовательский интерфейс / ввод перестали отвечать, когда ИИ рассчитывает свой следующий ход. Поскольку ваша игра в основном реагирует на ввод данных пользователем и обновляет визуальные эффекты, второй поток не требуется.


Отвечая на вопрос «Требуется ли цикл»?

Нет , но альтернативы сложнее, сложнее в реализации и используются редко.

Игры по определению являются интерактивными. Как минимум, это ожидание ввода и обновление вывода. Самый простой способ сделать это с помощью цикла. Для этого не нужно создавать новую ветку.

Несмотря на то, что игра, о которой вы упомянули, выглядит простой, она имеет интерактивные визуальные эффекты и звуки и постоянно обновляет их, основываясь на пользовательском вводе.

Альтернатив для игрового цикла тоже не много. Может быть возможна какая-то система, основанная на прерываниях. Однако такие системы увеличивают сложность и уменьшают другие факторы, такие как детерминизм. Есть причина, по которой игровые циклы настолько распространены, что их легко реализовать, легко понять, они гибки и отлично справляются со своей задачей.

MichaelHouse
источник
Единственный раз, когда я сталкивался с прерываниями более низкого уровня, был когда определенная задача HW была выполнена, и CPU / OS нужно было уведомить, чтобы они могли должным образом обработать это (чтение данных с диска в память и затем уведомление, что оно готово, чтобы мы могли вернуться контроль над приложением и разрешение его обрабатывать), поэтому я не знаю, что вы имеете в виду, и просто неверно истолковал его.
AturSams
2

Ответ на актуальный вопрос (должен ли игровой цикл быть в отдельной теме):

Причина, по которой люди часто рекомендуют использовать отдельный поток, заключается в том, что они не хотят, чтобы тяжелая обработка мешала интерактивности пользовательского интерфейса. Вы единственный, кто может сказать, нужна ли отдельная тема для вашей игры. От движка и фреймворка полностью зависит, может ли основной игровой цикл в вашем нынешнем дизайне влиять на время отклика пользовательского интерфейса. Думаю, вы обычно предполагаете, что это не будет (в небольших проектах), если у вас нет причин думать иначе.

Другая причина хранить код в отдельных потоках - это сохранять код модульным и простым. Смешивание двух не связанных между собой частей кода часто может привести к тому, что код станет менее читаемым и поддерживаемым в долгосрочной перспективе.

Должен ли игровой цикл выполняться в отдельном потоке? Возможно. Если есть проблема со временем отклика или кодом, и вам нужно ответить на несколько элементов пользовательского интерфейса, независимо от интенсивной обработки, или вы просто хотите разбить код на конкретные задачи, которые выполняются одновременно по соображениям проектирования, то используйте его. Тем не менее, это считается передовой практикой программирования.

Простой, но, возможно, не лучший пример для иллюстрации - игра для двух игроков. Возможно, вы захотите запустить два экземпляра класса, который обрабатывает ввод пользователя и преобразует изменения состояния в экземпляре персонажа игрока.

Некоторые фреймворки поощряют / требуют от вас использовать систему, основанную на событиях / прерываниях, как ActionScript3.0. В этом случае код цикла обычно переходит к OnEnterFrameсобытию или чему-то подобному, что происходит 20 - 60 или 120 раз в секунду.


Ответ на оригинальный вопрос (нужен ли основной цикл):

Все сводится к счетчику программ . Если вы создаете игру, которая будет работать дольше заданного промежутка времени и не будет генерировать код в процессе работы, вам нужно будет попросить компьютер вашего пользователя повторить некоторые инструкции, которые он уже обработал, и что, возможно, изменится в Тем временем это состояние (значения хранятся в объектах и ​​глобалах игры).

Поскольку вы знаете, что вам нужно будет повторять инструкции, есть несколько способов выполнить эту задачу и постоянно обрабатывать одни и те же инструкции. Все эти методы включают перемещение счетчика программы обратно к текущей соответствующей инструкции. Наиболее распространенные операторы потока управления, которые вызывают повторение кода, называются циклами, другой - gotoоператор, который редко используется в современном коде и имеет подобный эффект в этом случае (совершенно не относится к вам).

Итак, чтобы ответить на ваш предыдущий вопрос, вам нужен цикл? Да, вы делаете.

AturSams
источник
1
Насколько я знаю, основанные на событиях фреймворки, такие как AS3, до сих пор имеют игровой цикл. Я говорю о прерываниях более низкого уровня, а не о структуре, которая реализует систему событий.
MichaelHouse
Хм .. Я не думаю, что люди часто используют прерывания более низкого уровня в играх. AFAIK они в основном используются процессором для мониторинга операций ввода-вывода. Я думал о абстракции более высокого уровня как о практике проектирования, где вы реагируете на пользовательский ввод или аппаратную активность (без опроса), а не выполняете несколько инструкций в каждом кадре, а затем говорите HW визуализировать результат.
AturSams
1
Да, люди уже не часто их используют. Как я уже сказал, ими труднее пользоваться, и теперь у нас гораздо лучшие способы. Я понимаю, что вы говорите, и это, конечно, другой способ думать о вещах, но только на первый взгляд это выглядит по-другому, под этим циклом того же типа.
MichaelHouse
Я согласен с @ Byte56, это сводится к циклу, если мы не говорим о событиях уровня ядра, которые используют прерывания ввода-вывода.
concept3d
1
Я знаю это, но почти все, что мы делаем, под поверхностью одинаково (как я уже говорил, меняя значение счетчика программы). Это не секрет, и я указал на это в ответе. Программирование на основе событий, по-видимому, отличается, потому что мы перемещаем счетчик программ к различным функциям, когда происходят разные события. Очевидно, что существует возможность циклического опроса, чтобы проверить, произошли ли эти события в последнее время, но, как принцип проектирования, он выглядит по-другому.
AturSams
0

Просто добавьте к ответам других людей то, о чем никто явно не упомянул: если вы рискуете запустить игровой цикл во втором потоке, и он перестает отвечать, вы рискуете, что ОС закроет ваше приложение. Вот почему рекомендуется использовать отдельный поток. Следовательно (например) NDK's native_app_glue.c/ .hпорождает отдельный поток для вашего цикла.

инженер
источник