Войти
ПроектыФорумОцените

Как реализовать эффективно игровые комнаты в мультиплеере

#0
(Правка: 19:46) 19:43, 8 июня 2021
lobby2 | Как реализовать эффективно игровые комнаты в мультиплеере

Для разделения игроков по игровым комнатам  ,лобби предлагаю  какой алгоритм ,а  вы предложите свой  более эффективный пожалуйста ибо я недавно в гейдев .
Язык реализации C# ,но думаю похоже будет и на всех остальных .

Считаю ,что на каждом сервере должно быть фиксированное максимальное количество игроков
Будем хранить наши комнаты  в потокобезпасном словаре.
     
1)

public static ConcurrentDictionary<Guid, Room> Rooms= new ConcurrentDictionary<Guid, Room>();


для упрощения представим коминату  таким классом

class Room
{
  public  BlockingCollection<Player> Players = new BlockingCollection<Player>()

}


2) Сразу при запуске  сервера  создадим 100 пустых игровых комнат.

        public static void CreatePoolGame ()
        {
            for(int i=0;i<100;i++)
            {
                Rooms.TryAdd(Guid.NewGuid(), new Battle());
            }

        }


3) При входе в лобби ищем то в котором менее 5 игроков

IEnumerable<KeyValuePair<Guid, Room>> selectedRoom =
Rooms.Where(i => i.Value.Players.Count < 5).Select(u => u).Take(1);

если такие есть присоединяемся .

KeyValuePair<Guid, Room> room = selectedRoom.FirstOrDefault();


while (!room .Value.Players.TryAdd( fighterAircraft)) ;


Ваши предложения как это организовать эффективнее в плане производительности и более профессионально. Достаточно ли  такого решения для мультипллерной игры ?


#1
(Правка: 20:27) 20:27, 8 июня 2021

vladtepesh1488
> Ваши предложения как это организовать эффективнее в плане производительности и
> более профессионально.
взять готовые комнаты - смартфокс/фотон/любуюдругуюпопулярную

#2
23:53, 8 июня 2021

Mephistopheles
И как это в мой самописный сервер на C# добавить?

#3
14:11, 9 июня 2021

vladtepesh1488
> И как это в мой самописный сервер на C# добавить?
Посредством программирования

#4
(Правка: 15:48) 15:29, 9 июня 2021

Mephistopheles
Это мне понятно ,это фреймворки какие-то которые на 90% решают мои задачи? Я так понимаю они все под Unity?Я делаю клиент  браузерный на Three.js

#5
0:56, 10 июня 2021

посмотрите в сторону Playfab
у них есть sdk на js  https://github.com/PlayFab/JavaScriptSDK

#6
1:05, 10 июня 2021

vladtepesh1488
>Я так понимаю они все под Unity?
ну фотон универсальный.

halmy
> посмотрите в сторону Playfab
Кстати как вариант.

#7
19:41, 11 июня 2021

Создавай комнаты по мере необходимости.
Игрок заходит, ищем комнаты с вакантными местами, если нет - создаем новую комнату.

А вообще, если Three.js, то мб и сервер на node.js?

#8
14:49, 12 июня 2021

MAXIM
Я просто думал ,что  комнат лучше имметь фикированное количество ,чтоб постоянно не выделять динамически память удаляя и вставляя новые обьекты в  в Dictionary <Battle> Room  . Кроме того это позводит избежать перегрузки сервера . node.js  я от него отказался в пользу  C#  и  SignalR  так как там лучше  работа с многопоточнностью и асинхронностью.

ПроектыФорумОцените