Многопользовательская онлайн игра – передача пакетов и обмен сообщеями между клиентами и сером(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)На главном сервере так же создается очередь сообщений
Хочу знать ваше мнение по поводу данного алгоритма и концепции в целом.
ссылка на оригинал статьи https://habrahabr.ru/post/280720/
Добавить комментарий