Основная многопользовательская реализация

В настоящее время я пишу приложение для симулятора для игры 5vs5 UDK.

Вот сценарий, по которому я построил свой код:

  1. Игрок начинает игру и аутентифицирует
  2. Игрок нажимает на огромную кнопку «Воспроизвести» и просит сервер для открытого лобби.
  3. Сервер ищет лобби и добавляет игрока в найденное лобби и отправляет игроку информацию о лобби, чтобы он мог соответственно реагировать (идентификатор лобби, игроки в фойе). Обратите внимание: если лобби не найдено (все лобби полны или вообще нет лобби), то создается новый.
  4. Игрок (теперь в фойе) выбирает символ и нажимает кнопку «Готово».
  5. Как только все игроки готовы, сервер ищет противоположную команду.
  6. Как только встречная команда найдена, сервер отправляет информацию соответствия (udk server ip и порт) всем заинтересованным игрокам

Я написал свой сервер знакомств с шаблоном C # Web Api. Этот веб-сервис RESTful может в настоящий момент заботиться о шагах 1, 2 и 3, поскольку они являются транзакциями между интерфейсом (игроком в игре UDK) и бэкэнд (сервером Matching C #). Игрок запрашивает что-то, сервер отвечает данными JSON. Я сделал это, потому что многие HTTP-запросы кажутся менее глупыми, чем наличие всех аутентифицированных игроков в постоянно подключенном TCP-соединении.

Однако для следующих шагов (, в частности, шагов, связанных с тем, что происходит внутри лобби ), я не понимаю, какой подход я должен предпринять. Как сервер может уведомлять игроков о новых событиях (отключения, новый игрок, персонаж, выбранный игроком, игрок готов ...)? Должны ли игроки опросить сервер на (очень) регулярной основе для новых событий? Или было бы лучше иметь пул потоков, чтобы поддерживать соединение TCP с игроками, чтобы транслировать новые события? Или что-то другое? (UDP?). Я немного потерян.

Это мой первый пост, поэтому я надеюсь, что это не плохо сформулировано. Спасибо.

3 голоса | спросил Tom Solacroup 3 Maypm15 2015, 23:50:13

2 ответа


1

Есть много вещей, которые вам нужно учитывать. Прежде всего, где вы размещаете свои серверы? UDP отлично работает, если вы размещаете свое собственное оборудование, но если вы используете что-то вроде AWS, тогда вы в конечном итоге потратите много времени, пытаясь получить хорошее надежное решение. Трафик UDP не может быть сбалансирован с нагрузкой, используя балансировщик нагрузки по умолчанию, поэтому вам придется подвергать отдельные экземпляры пользователям. То же самое касается услуг Azure и Google.

Кроме того, если вы настроите таргетинг на мобильный, забудьте о UDP. Мобильные носители данных имеют спорадическую поддержку для UDP. Иногда это сработает, иначе это не будет. Я знаю, что вы можете проверить, находится ли пользователь в своей сотовой сети или использовать Wi-Fi, но ограничение пользователей только в том случае, когда они являются Wi-Fi для использования UDP, не является хорошим решением на мой взгляд.

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

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

Имейте в виду, что у вас есть ограничение на количество сокетов /потоков, которые вы можете создать для каждого окна. Розетки ограничены примерно 16 миллионами ( 16,777,214 , если быть точным), но потоки намного хуже . С потоками можно получить несколько сотен, но это не рекомендуется. Для выделения стека требуется патрон смежной памяти, поэтому вы быстро запускаете верхние границы памяти после того, как начнете создавать потоки /выключения для каждого соединения.

Легкий опрос с атомной проверкой, безусловно, является лучшим выбором, если сервер использует пул потоков и автоматически обрабатывает пул соединений keep-alive.

О, и атомными операциями я имею в виду следующее определение: Atomicity - это гарантия изоляции от параллельных процессов (от разрешение конфликтов .

ответил Ken Noland 12 Maypm15 2015, 16:25:33
0

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

ответил John McDonald 4 Mayam15 2015, 00:29:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132