Я разрабатываю игровой TCP-сервер и планирую выдерживать до 500 соединений.Передача данных происходит постоянно (движение персонажа, атака и т. Д.).
Я начал разработку с TCPListener , но у меня возникла проблема с производительностью.Я использовал методы await XXXSync для приема клиентов, получения данных и отправки сообщений.
Я создал программу, которая имитирует действия игроков.Это позволило создать только 30-40 соединений, и это вызвало 100% загрузки процессора.Для тестирования своего сервера я использовал две машины: одна была симулятором игроков, а другая - сервером.Эти 30-40 клиентов загружают ЦП на сервере на 10-20% и очень сильно (при 100%) при одновременном отключении всех клиентов TCP.
Я искал информацию об оптимизации TCPListener, но ничего не нашел.Я видел темы, где люди писали, что у них есть сервер с более чем 1000 подключений, и это хорошо работает.
Я думал, что причина может быть в логике моего сервера, но инструменты профилирования показали, чтоОсновная часть загрузки процессора - это получение и отправка данных (ждите client.ReadAsync / client.WriteAsync). Изображение 1 | Рисунок 2
Я начал искать возможные альтернативы и нашел SocketAsyncEventArgs .На форуме люди писали, что этот метод может увеличить производительность в 2 раза.Я нашел исходные коды некоторых серверов, написанных на C #, и взял оттуда реализацию SocketAsyncEventArgs.
Это действительно значительно увеличило производительность в 10-15 раз.Для 30 симуляций это вызывает только 0,5-2%.
Я переписал эмулятор игроков в SocketAsyncEventArgs, и это позволило мне создать 100 симуляций с 20% CPU.
После 70 игроковнагрузка на процессор на сервере выросла и составляет 7-13%.Инструменты профилирования показывают, что основное использование ЦП - это отправка сообщений.Почему-то самым продуктивным вариантом для меня был BeginWrite.Запись не подходит, потому что это блокирует поток.WriteAsync был медленнее, или я просто неправильно его использовал. Изображение 3 | Изображение 4
Не могу найти информацию об оптимизации сокетов на c #.Все везде пишут, что у них все хорошо, даже на TCPListener, что для меня просто невыносимо.
Есть ли другой способ улучшить производительность?
PS Я тестировал сервер на компьютере с i7 седьмого поколения.