Как избежать создания одной темы на комнату (группу игроков) - PullRequest
0 голосов
/ 29 сентября 2011

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

Процесс игры в игру примерно такой: Клиентское приложение (проигрыватель) & rarr; подключиться к лобби-серверу & rarr; проверить наличие комнаты с игрой, в которую он любит играть & rarr; лобби отвечает на запрос и указывает игроку на правильный игровой сервер (все используют «сырые» TCP / сокеты).

Каждый игровой сервер автоматически запускает игру, когда в комнате присутствует как минимум 4 игрока (возможно несколько комнат) и максимум 12. Каждая комната запускается в отдельном потоке, я имею в виду, я создаю один поток на комнату ( 4-12 игроков), поэтому, если у меня есть 1.200 (гораздо больше можно ожидать от игрового сервера), то будет не менее 100 потоков (даже больше, в зависимости от того, сколько игроков действительно в каждой комнате). Основной поток (и это работа) плюс все созданные потоки будут потреблять все ресурсы на моем сервере ... поэтому мне было интересно, кто-нибудь может предложить лучшую идею или подход?

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

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

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

0 голосов
/ 29 сентября 2011

Исходя из опыта разработки MUD, обычным процессом для такого рода вещей является работа с моделью "heartbeat":

  1. У вас есть поток таймера, который генерирует событие / сообщение сердцебиения через равные промежутки времени.
  2. С каждым пульсом подписанный поток чтения проверяет все подключенные сокеты, чтобы увидеть, есть ли у них какие-либо данные для чтения. В этом случае команды (нажатия кнопок и т. Д.) Могут быть помещены в очередь (вместе с указателем того, какой пользователь, комната и т. Д.) Для чтения основным игровым процессором.
  3. Игровой процессор просто обрабатывает сообщения из входящей очереди и выдает ответы (которые могут быть помещены в исходящую очередь для доставки, если вам это нравится).

Именно так я всегда делал это, когда писал серверы чата, собеседников и MUD, и похоже, что это может хорошо соответствовать вашим требованиям.

НТН

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