ФорумПрограммированиеОбщие вопросы программирования → Архитектура игрового сервера

Архитектура игрового сервера

  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

    Spritz 1 апреля 2016 г. 0:54

    Доброго времени суток! В голову пришла мысль создать игру на Java, так как играть одному неинтересно - игра будет многопользовательска.
    Движок выбран Jmonkey на базе jogl.
    В голову приходит клиент серверная архитектура с небольшими поправками - из того что я нашел в интернете:
    1. Клиент посылает сообщения на сервер.
    2. Сервер их принимает и оповещает остальных игроков - изменение координат, нажатие клавиш, etc.

    Тут у нас сходу появляется несколько проблем:
    1. У всех разная скорость соединения нужно как то делать поправку на пинг, даже не знаю как можно сделать корректировку.
    2. Непрерывный флуд, пользователи асинхронно посылают сообщения на сервер и при каждом сообщении нужно оповещать всех остальных игроков.
    Решение: 1) посылать сообщения не каждый раз при нажатии, а по таймауту. 2) На сервере составлять очереди сообщений и высвобождать их одновременно, так же по таймауту.
    3. Игрок нажал кнопку ходить и начал двигаться в определенном направлении у себя на клиенте, но сообщение еще не поступило на сервер и к другим игрокам тут у нас происходит рассинхронизация, пока сервер не будет оповещен и другие игроки не получат его новые действия и координаты с поправками.
    Если кто то сталкивался с такими проблемами в играх или в подобных приложениях.
    Подскажите направление решения задачи, какие еще проблемы могут встретится в подобной архитектуре. Спасибо.

  • master

    Сообщения: 3234 Репутация: N Группа: Джедаи

    Spritz 1 апреля 2016 г. 1:07, спустя 13 минут 8 секунд

    1. посылать сообщения нужно конечно же сразу, не нужно щемить игроков с быстрым пингом

    2. отправлять игроку не изменения состояний, а сами состояния (то есть абсолютные значения, а не дельту) актуальные а) на момент отправки б) только для него. хотя тут зависит от объёмов данных.

    3. игрок делает ход -> ход отправляется на сервер -> сервер решает "ага, игрок походил", пересчитывает координаты -> новые координаты отправляются всем игрокам (кому это актуально). клиент игрока в это время тоже расчитывает новые координаты и рисует _предполагаемые_ изменения в интерфейсе, когда от сервера приходят реальные данные - он либо оставляет всё как есть, либо перерисовывает графику в соответствии с полученными от сервера данными.

    я бы так сделал

    не всё полезно, что в swap полезло
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

    Spritz 2 апреля 2016 г. 4:10, спустя 1 день 3 часа 3 минуты

    Дополнил идею
    Многопользовательская онлайн игра – передача пакетов и обмен сообщеями между клиентами и сером(client-server,p2p,tcp/upd, графы)
    Представьте себе многопользовательсукую игру по типу lineage

    Описание процесса и поставновка задачи:

    1)каждый игрок совершает действие у себя на клиенте и должен оповестить об этом игроков монстров и игровые объекты в определенном радиусе.
    2) Игрок должен видеть 3d объекты и монстров только в опреденном радиусе.
    3) Сервер выполяя действия за мир и монстров и оповещает об этом всех игроков или игроков в опреденном радиусе от объекта.
    4) игрок монстры и сервер выполняя действия формируют сообщения или пакеты
    5) формат игрового сообщения или пакета псевдокод

    [player1,player2,server][time_stamp][client/server][geo_location][game_map_location][net_key][player_id][visible_radius]–
    [player1,player2,server]Где каждый элемент это серриализованный объект
    player[
    actions[ [hit,player2,fireball],[run,vector],[rotate,radius] ],
    player[param1,param2],
    items[item1,item2],
    message[string,chat],
    gruops[clan,party],
    time[time_stamp]
    ]

    Если отправлять сообщения от клиентов на сервер и формировать большой пакет.

    Проблемы:

    1) Синхронизация игроков
    2) Клиент серверная синхронизация
    3) Низкая скорость передачи tcp/upd, низка скорость передачи clien-server
    5) Обо всех пакетах должен знать только сервер,
    6) Игроки находятся на разном расстоянии географически – что снижает скорость передачи
    7) Необходимо посылать пакеты только соседним объектам
    8) Пакеты могут потеряться, пакеты можно подменить

    Варианты решения на уровне игры:
    1) Двумерный массив [][] который соответсвует физической карте игрового мира
    2) Добавление игровых объектов в этот массив
    3) Добавление радиуса видимости для каждого объекта который может посылать пакеты
    4) Объект посылает пакеты только объектам которые находятся в определенном радиусе от него
    6) Формируются группы объектов
    5) Один из объектов назначается главным
    6) Каждый из группы объектов посылает каждому пакет
    7) Создается эталонный пакет
    8) Главный объект группы посылает всем эталонный пакет

    Решение на уровне сети и сервер:
    1)Берется карта мира и создается двумерный массив, ячейка содержит в себе информацию о регионе[country][city] и обо всех клиентах находящихся в регионе
    2)По этим точкам строится граф и просчитываются кратчайшие пути до каждой точки
    3)В каждом регионе выбирается несколько клиентов с самой высокой скоростью
    4)Один из клиентов становится сервером передачи данных для всех остальных в регионе
    5)Сервера региона передают сообщения по цепочке и по кратчайшему пути между собой и до сервера

    1)Клиенты посы лают сообщения по таймауту
    2)На сервере создается поток который формирует очереди сообщений
    3)На главном сервере так же создается очередь сообщений

  • master

    Сообщения: 3234 Репутация: N Группа: Джедаи

    Spritz 2 апреля 2016 г. 4:16, спустя 6 минут 3 секунды

    Проблемы:

    1) Синхронизация игроков
    2) Клиент серверная синхронизация
    3) Низкая скорость передачи tcp/upd, низка скорость передачи clien-server
    5) Обо всех пакетах должен знать только сервер,
    6) Игроки находятся на разном расстоянии географически – что снижает скорость передачи
    7) Необходимо посылать пакеты только соседним объектам
    8) Пакеты могут потеряться, пакеты можно подменить

    @Padaboo, это описание ситуаций, а в чём сами проблемы? Проблемы - это когда есть "но", т.е. конфликтующие требования или условия.

    Спустя 64 сек.

    7) Необходимо посылать пакеты только соседним объектам

    @Padaboo, делите игровое поле на шестиугольные зоны (соты) и отправляйте игроку информацию о его соте и шести смежных.

    Спустя 150 сек.

    3) Низкая скорость передачи tcp/upd, низка скорость передачи clien-server

    @Padaboo, это с учётом udp (пакетов без подтверждения доставки) и сокетов?

    Спустя 27 сек.

    пакеты можно подменить

    @Padaboo, а кому это надо?

    Спустя 156 сек.

    если я правильно помню, то кто-то на пыхе выкладывал видео, где девелоперы wargaming рассказывали о технических аспектах разработки WOT

    Спустя 232 сек.

    @Padaboo, на какую игру как пример вы ориентируетесь?

    не всё полезно, что в swap полезло
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

    Spritz 2 апреля 2016 г. 11:25, спустя 7 часов 8 минут 50 секунд

    @master интересует мморпг, интересная идея с шестиугольными зонами, а можно сделать граф искать соседей.
    Клиент в любом случае просто посылает/принимает пакеты и оповещает соседние объекты и сервер.
    Вопрос в том как сделать это лучше - в плане снижения нагрузки и ускорения передачи данных.

  • master

    Сообщения: 3234 Репутация: N Группа: Джедаи

    Spritz 2 апреля 2016 г. 11:42, спустя 17 минут 21 секунду

    @Padaboo, зачем клиенту оповещать соседние объекты?

    не всё полезно, что в swap полезло
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

    Spritz 2 апреля 2016 г. 11:46, спустя 3 минуты 59 секунд

    @Padaboo я на клиенте побежал в одну сторону, соседний игрок побежал в другую сторону: надо что бы оба об этом узнали.

  • master

    Сообщения: 3234 Репутация: N Группа: Джедаи

    Spritz 2 апреля 2016 г. 11:49, спустя 2 минуты 40 секунд

    Оказалось, всё придумано до нас. Погугли "гексагональная сетка" и "гексагональная система координат"

    Спустя 44 сек.

    @Padaboo я на клиенте побежал в одну сторону, соседний игрок побежал в другую сторону: надо что бы оба об этом узнали.

    @Padaboo, узнаете оба от сервера

    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 2 апреля 2016 г. 11:52, спустя 2 минуты 45 секунд

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

    Спустя 76 сек.

    nio да, был такой стек от самой sun

    Спустя 10 сек.

    типа такого menacher/java-game-server [github.com]

    Спустя 66 сек.

    NugServer [nugserver.io]

    Спустя 66 сек.

    если это будет 3d, то надо тебе еще движок с поддержкой 3d geodata, чтобы не было возможности "проваливаться" или через стенки бегать и тп

    Спустя 35 сек.

    я в свое время жестко перерабатывал двигло для lineage II и сетевое ядро для Aion

    Сапожник без сапог
  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 2 апреля 2016 г. 12:02, спустя 10 минут 45 секунд

    Netty: Home [netty.io]

    Сапожник без сапог
  • kostyl

    Сообщения: 5196 Репутация: N Группа: Джедаи

    Spritz 2 апреля 2016 г. 13:06, спустя 1 час 3 минуты 59 секунд

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

    @phpdude, +1

    @phpdude @master это ж @Padaboo он вечно хуйней занимается сколько я помню

  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 2 апреля 2016 г. 13:07, спустя 48 секунд

    @kostyl, ну да пожалуй ты прав, я поэтому и не встрявал, чисто высказался и больше не буду, ибо я все сказал ))

    Сапожник без сапог
  • master

    Сообщения: 3234 Репутация: N Группа: Джедаи

    Spritz 2 апреля 2016 г. 13:08, спустя 47 секунд

    узнаю пыху

    не всё полезно, что в swap полезло
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

Пожалуйста, авторизуйтесь, чтобы написать комментарий!