Если движение каждого игрока отправлять всем, кто его видит, число обновлений растёт как квадрат числа собравшихся.
Почему Изменение у одного игрока рассылается всем, кто его видит → Следствие Если 1 000 игроков видят друг друга, это 1 000 000 обновлений за тик → На экране Очереди отправки и пропускная способность забиты: задержки и потери (задержка ввода, перемотка, телепортация)
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура
Команда разработки: задачи
Снижать частоту обновлений по расстоянию и важности (близкие враги каждый тик, дальние игроки несколько раз в секунду), ограничить объём отправки одному игроку и заполнять его в порядке важности, объединять несколько обновлений в один пакет, ограничить число отображаемых игроков.
Команда инфраструктуры: задачи
Сравнивать исходящую пропускную способность и число пакетов в секунду на каждом сервере с сетевыми лимитами NIC и инстанса и настроить алерты, проверять запас перед крупными событиями.
Цифры для ориентира
1 000 игроков × 1 000 игроков × 20 тиков = 20 000 000 обновлений в секунду. При 40 байтах на обновление это около 6,4 Gbps на весь сервер и около 6,4 Mbps на каждого получателя. Если ограничить число видимых игроков до 150, выходит около 1 Gbps на сервер и около 1 Mbps на игрока.
На графике
Растёт вслед за онлайном и нагрузкой · исходящие пакеты и байты сервера, число игроков в одном месте
Где смотреть
Смотреть txpck/s и txkB/s из sar -n DEV 1 (пакеты и KB, отправленные NIC сервера за секунду) вместе с графиком числа игроков. Для облачных инстансов смотреть счётчики превышения лимитов в ethtool -S (для AWS ENA bw_out_allowance_exceeded и pps_allowance_exceeded)
Подтверждает
С ростом числа собравшихся исходящие пакеты и байты растут круче, чем число игроков (почти квадратично), а с момента упора в лимит растут счётчики превышения лимитов или отбрасывания при отправке
Опровергает
Если исходящий трафик не меняется, а растёт только время тика, дело в расчёте видимости или игровой логике
Actor Priority in Unreal EngineEpic Games Когда пропускная способность соединения исчерпана, каждому актору назначается приоритет (расстояние, направление взгляда, время с последней отправки), и полоса раздаётся начиная с самых важных
Detailed Actor Replication Flow in Unreal EngineEpic Games NetUpdateFrequency задаёт частоту обновления для каждого актора. Акторы отправляются по приоритету, а когда соединение забито, остальные откладываются до следующего тика
sar(1) — Linux manual pagesysstat rxpck/s и txpck/s в sar -n DEV (принятые и отправленные пакеты в секунду), rxkB/s и txkB/s (принятые и отправленные KB в секунду)