Создание (многопоточного) игрового сервера на C ++ / WinSock - PullRequest
3 голосов
/ 24 февраля 2010

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

Поиск предложений о том, как это сделать для игры, а также для сервера (если ваше предложение не являетсяодинаково для обоих).Любые вопросы, не стесняйтесь спрашивать:)

Спасибо!

Ответы [ 3 ]

1 голос
/ 24 февраля 2010

Что вам нужно сделать, это настроить исходящую очередь сообщений для каждого клиента. Скажем, у вас есть 2 клиента, подключенных к серверу, один из которых обслуживается потоком A, а другой - потоком B. Поток A должен выполнить WaitOnMultipleObjects() для своего сокета и для переменной семафора / mutex / condition для своей очереди. Таким образом, если он получает что-то в своей очереди, он может проснуться и отправить его. Если он получает сообщение от клиента, которое ему не нужно передавать клиенту B, он обрабатывает это сообщение и помещает его в исходящую очередь потока B.

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

1 голос
/ 24 февраля 2010

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

0 голосов
/ 24 февраля 2010

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

...