Модель потоков для многопользовательского игрового сервера - PullRequest
0 голосов
/ 07 мая 2020

Предположим, у меня есть многопользовательская игра, основанная на матчах. Я хочу создать многопользовательский сервер, который мог бы обрабатывать многие из этих матчей одновременно. Обычно для параллельных вычислений я просто порождаю процесс / поток / волокно, запускающий игру l oop для каждой комнаты для матчей, и позволяю любому встроенному планировщику обрабатывать это. Однако для игр в реальном времени я предполагаю, что вы не захотите слепо запускать планировщик, поскольку вам нужно поддерживать некоторую желаемую тиковую скорость, и планировщик вряд ли будет поддерживать эту тиковую скорость для каждого процесса / потока / волокна.

Аналогично , как бы вы поступили со всеми входящими подключениями? Опять же, я предполагаю, что один поток на соединение не работает, поскольку вы не хотите, чтобы планировщик ОС все обрабатывал.

Если бы у вас был 4-ядерный ЦП, я бы подумал, что нужно иметь 1 поток для управлять всеми сетевыми запросами, которые будут фильтровать входящие запросы игроков и направлять их в правильный канал игровой комнаты / потокобезопасную очередь. Точно так же три других потока будут действовать как пул потоков и обрабатывать игру l oop для каждого совпадения и отправлять новое состояние в некоторую канальную / потокобезопасную очередь, которую сетевой поток затем может отправить обратно игрокам. Вы можете поддерживать тикрейт, вычисляя p99 игры l oop, и никогда не запускать больше совпадений на одном сервере, чем (#threads) / (p99).

Звучит ли это разумно? У меня нет опыта работы с сетью / многопользовательской игрой в реальном времени, и Google возвращает слабые результаты, поэтому заранее извиняюсь, если это очень простой c вопрос.

...