Оптимизация сервера локальной сети для игры - PullRequest
2 голосов
/ 13 ноября 2009

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

Я читал «Сетевое программирование для Microsoft Windows» Энтони Джонса и Джима Олунда. Они упоминают две разные модели для сервер-клиентских приложений.

1.)

  • Использование перекрывающихся опций сокета IO
  • Передать перекрытую структуру и WorkerRoutine в WSARecv
  • Вызовите WSAWaitForMultipleEvents () или SleepEX (), чтобы установить поток для оповещения.
  • Обработка полученных данных в WorkerRoutines.

2.)

  • Использование опций сокета IO с перекрытием
  • Создать порт завершения ввода-вывода
  • Создание ServerWorkerThreads (сколько бы у вас ни было CUP)
  • Свяжите порт завершения с сокетом.
  • Вызовите GetQueuedCompletionStatus в ServerWorkerThread и обработайте полученные данные.

Я хотел знать, какой метод лучше всего подходит для моих обстоятельств. В книге говорится, что модель Completion Port отлично подходит для тысяч клиентов, но это заставляет меня думать, что она создана для большого сервера, а не для маленькой сетевой игры. Система WorkerRoutines / Event выглядит проще.

1 Ответ

2 голосов
/ 13 ноября 2009

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

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

И убедитесь, что вы используете примитивы синхронизации (семафоры), чтобы не потерять синхронизацию с самим собой.

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

...