Темы для одноранговой связи - PullRequest
1 голос
/ 21 сентября 2010

Я пытаюсь сделать многопользовательскую сетевую игру. Каждый игрок представлен прямоугольником на экране. Я использую OpenGL для графики, а также пользовательский ввод (такие команды, как MOVE-LEFT, MOVE-RIGHT и т. Д.) Будет обрабатываться им (или GLUT или сумма).

У меня есть следующая архитектура для игры.

В игре 4 игрока (узла). Каждый игрок отправляет и получает данные, используя UDP. Каждый игрок может отправить данные любому другому игроку.

Данные должны быть отправлены игроком, если есть какие-либо данные от соответствующего пользователя. (Например, команда MOVE-LEFT и т. Д.). Всякий раз, когда игрок (скажем, p1) получает какие-либо данные от любого другого игрока (например, p2) (например, новую позицию игрока p2 на экране), экран игрока p1 должен обновляться немедленно.

Я думаю о следующих строках: Создайте один поток для обработки графики. Создайте еще 2 потока, по одному для получения и отправки данных, используя UDP.

Всякий раз, когда графический поток получает ввод для «myposition» от пользователя, он обновляет общую глобальную переменную «myposition». Поток сетевой отправки, который ожидает эту переменную, активируется и сообщает каждому другому игроку о своей новой позиции.

Аналогичным образом, всякий раз, когда обновления «позиции» поступают от любого другого игрока «i», поток приема в сети обновляет глобальную переменную player [i] .position. Графический поток теперь будет перерисовывать сцену с обновленными позициями.

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

1 Ответ

5 голосов
/ 22 сентября 2010

Программирование сетевых игр - монстр темы, поэтому трудно сказать «да, именно так вы разрабатываете сетевую архитектуру».Это полностью зависит от ваших игровых требований.Какой объем пакетов вы планируете отправлять?Будет ли отправляться пакет в каждом кадре, который указывает, что игрок A держит левую клавишу?Этот трафик ограничен локальной сетью?

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

Например, вы можете захотеть создать игровой цикл, подобный следующему (все в одной и той же теме):

while (running):
    readUpdSocketForIncomingPackets();
    updateGameObjects();
    renderGameObjects();
    sendPacketsToPeers();

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

Но, опять же, это большая тема, и у меня много деталей.

Посмотрите на блог gaffer: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/

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

...