Являются ли актеры правильным инструментом для реализации обмена сообщениями между простыми многопользовательскими играми? - PullRequest
4 голосов
/ 05 октября 2011

Я думаю об использовании актеров для простой астероидоподобной игры, написанной на Scala и Java2D, в которую могут играть два игрока в кооперативном режиме.

Оба игрока могут управлять своим кораблем на общем игровом поле, где астероиды плавают в пространстве.

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

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

Есть ли лучшее решение?

EDIT:

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

Оба клиента будут подключаться к нему, предпочтительно оба с удаленным актером, так что мне не нужно особый случай удаленного / локального случая.

У меня нет проблем с прохождением P2P-маршрута, если это проще. Требования фиксированы, и мне никогда не нужно планировать случай «нам нужна игра для 64 игроков !!!».

Ответы [ 3 ]

4 голосов
/ 05 октября 2011

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

Это было сделано в Python, и, поскольку мы не хотели полагаться на какие-либо внешние библиотеки, мы действительно писали свои собственные акторы и систему удаленных сообщений поверх них. Как оказалось, было несколько проблем со скоростью, но я думаю, что они были в основном связаны с тем, как Python работает с потоками (и с нашим отсутствием понимания). Тесты для Scala Actors или Akka всегда давали лучшие результаты, чем то, что мы могли сделать в Python.

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

В режиме реального времени у вас может быть входящая очередь (Actor) на сервере для приема всех ходов клиента и, возможно, отдельный канал для состояния игры, чтобы избежать блокировки. Это действительно было бы немного сложнее для синхронизации. Так что это зависит от того, насколько быстро вам нужны обновления.

3 голосов
/ 06 октября 2011

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

Кроме того, многопользовательское ядро ​​Call of Duty написано на Erlang .Это ссылка на презентацию ребят, которые это сделали, и это очень интересный материал.

1 голос
/ 05 октября 2011

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

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

Можно использовать API RemoteActor для прямого доступа к удаленным субъектам или использовать промежуточную среду связи (например, сокеты) для транспортировки сообщений.

Я предполагаю, что нет центрального сервера для координации игроков.

...