Как мне управлять связью между потоками ИИ и основным игровым циклом? - PullRequest
5 голосов
/ 09 декабря 2011

Я работаю над пошаговой стратегической игрой на Java (в рамках Android). Следуя структуре в Beginning Android Games, у меня есть нить рендеринга и нить пользовательского интерфейса. Поток рендеринга многократно обновляет состояние мира, а затем перерисовывает мир. Когда пользователь взаимодействует с экраном, графический интерфейс отправляет действия в мир (шаблон команд). Сейчас я добавляю AI игроков, и вот мой план:

Каждый ИИ-игрок будет иметь ИИ, который работает в отдельном потоке.

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

Игрок ИИ отправит запрос на действие в поток ИИ, а затем вернется.

В конце концов, ИИ придумает действие и отправит его обратно в Мир, который увидит его в следующем обновлении.

Два вопроса:

1) Кажется ли этот дизайн звучащим?

2) Как мне обработать связь с потоком AI? Если у меня есть поток AI, вызывающий world.queueAction (action), кажется, что он будет работать, но если поток визуализации вызывает ai.chooseAction (world), который будет запускать действие, выбирающее поток визуализации, а это не то, что мне нужно ,

Ответы [ 3 ]

4 голосов
/ 09 декабря 2011

Я хотел бы иметь ExecutorService для AI и добавлять к нему задачи для вещей, которые вы хотите, чтобы он выполнял. Для пользовательского интерфейса у вас может быть очередь вещей, которые изменились и, возможно, потребуется перерисовать. Я хотел бы использовать один поток для всех ИИ, пока вы не узнаете, что это поможет. Большинство Android-устройств в любом случае имеют только 1-2 процессора.

2 голосов
/ 09 декабря 2011

Вы уверены, что система сможет обрабатывать большое количество потоков? Помните, что «оптимальное» количество работающих потоков обычно n + 1, где n - это число ядер , которое имеется в системе. Если он работает на телефоне, их будет меньше, хотя, если у вас больше 10, вы можете быть в порядке ...

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

Я предполагаю, что у вас уже есть какое-то событие, чтобы уведомить игрока / обновить экран, когда настала очередь игрока. Сделайте то же самое с потоком (ами) ИИ - попросите его прослушать соответствующее событие «Это ваша очередь», заставив его завершить (эти итерации) вычисления и поместить действие в очередь. Обратите внимание, что это должно быть сделано из ветки «Обновление мира»; поток рендеринга должен быть связан исключительно с рендерингом вывода на экран (и только касательно связан с вводом игрока).

1 голос
/ 09 декабря 2011

Если я правильно понимаю:

  • У вас есть поток рендеринга.Предположительно, это выполняется с частотой кадров дисплея.
  • У вас есть поток "мировой логики".Это работает от некоторого предсказуемого таймера.
    • У вас есть общая физика, вход игрока или другие действия в одном потоке;
    • и отдельный поток для каждого AI-персонажа

Казалось бы, вы могли бы безопасно запустить каждый из логических потоков ИИ как Future и собрать их результаты вместе после выполнения того, что еще делает поток «мира» в каждом кадре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...