Превращение данных для отправки в байты и их сжатие тоже требуют CPU, и при большом числе игроков эти затраты резко растут.
Почему Для каждого обновления структура преобразуется в байты и сжимается → Следствие Затраты растут пропорционально квадрату числа игроков → На экране Отправка запаздывает: задержка ввода
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Переиспользовать один собранный пакет для многих получателей, использовать лёгкий формат.
На графике
Растёт вслед за онлайном и нагрузкой · загрузка CPU сервера, CPU потока, собирающего пакеты
Где смотреть
Сравнить через perf top -p долю функций сериализации, сжатия и шифрования (включая функции библиотек вроде zlib, LZ4, OpenSSL) в процессорном времени игрового процесса при малом числе игроков и при наплыве
Подтверждает
Чем больше игроков, тем выше доля функций сериализации, сжатия и шифрования, и первым упирается в CPU поток, собирающий пакеты
Опровергает
Если доля этих функций мала, дело в расчёте видимости или игровой логике
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Если соединение шифруется (TLS, DTLS и т. п.), CPU тратится ещё и на шифрование и расшифровку. Шифрование делается отдельно для каждого соединения, поэтому, даже если один собранный пакет переиспользуется для многих получателей, шифровать его приходится столько раз, сколько получателей. Симметричные шифры вроде AES-GCM настолько быстры, что одно ядро обрабатывает несколько GB в секунду, и обычно их доля невелика. Но скорость сильно зависит от размера единицы шифрования (записи), и когда, как в играх, много мелких пакетов, затраты на байт растут. При рукопожатии, которое выполняется один раз на подключение, сервер подписывает данные ключом сертификата и вычисляет обмен ключами (ECDHE). Одно ядро успевает в секунду от примерно 1 100 (RSA 2048) до 18 000 (ECDSA P-256) подписей и около 9 000 обменов ключами, поэтому при наплыве входов это заметная нагрузка.
Источники
Introduction to Iris in Unreal EngineEpic Games Реплицируемое состояние хранится в одной квантованной копии, что сокращает дорогую работу, а её результат используют сразу несколько подключений
VALORANT's 128-Tick ServersRiot Games Сравнивать реплицируемые переменные для каждого клиента каждый кадр и собирать изменившиеся значения медленно: память читается вразброс, и это сильно нагружает CPU сервера
How "expensive" is crypto anyway?Cloudflare Замеры BoringSSL: AES-128-GCM около 3,7 GB в секунду (сильно зависит от размера записи). Одно ядро в секунду выполняет 1 120 подписей RSA 2048, 18 477 подписей ECDSA P-256 и 9 394 обмена P-256 ECDHE. На edge-серверах Cloudflare TLS-библиотека расходует около 1,8% CPU