Для клиента в фоновом окне игра, движок и ОС снижают частоту кадров и объём обработки. Полученные пакеты не успевают обрабатываться, копятся и переполняют буфер.
Почему Ограничение кадров в фоне в настройках игры или графического драйвера (например, в драйвере NVIDIA задаётся от 20 до 200 в секунду), энергосбережение, настройка движка останавливаться в фоне. ОС тоже отдаёт приоритет по CPU и GPU окну на переднем плане → Следствие За кадр обрабатывается меньше пакетов, очередь растёт, а при переполнении буфера приёма пакеты отбрасываются → На экране Когда окно выводят на передний план, всё появляется разом, или некоторые NPC так и не появляются
Основной ответственный Команда разработки · Разработка клиента · Совместно Внешние стороны · Внешние стороны
Команда разработки: задачи
Продолжать приём сетевых данных в отдельном от игрового цикла потоке, гарантировать минимальный объём обработки и в фоне, включить в движке выполнение в фоне (в Unity это runInBackground).
Внешние стороны: задачи
Посоветовать игрокам отключить ограничение кадров в фоне в графическом драйвере и режим энергосбережения ПК.
Цифры для ориентира
В Unity при выключенном runInBackground игровой цикл останавливается в момент, когда окно теряет фокус. Если приём идёт только в этом цикле, всё это время пакеты вообще не обрабатываются.
На графике
Провал, затем пачка · интервал между кадрами клиента, число обработанных пакетов за кадр
Где смотреть
На одном ПК держать одно окно на переднем плане, а другое на заднем, менять их местами и сравнивать. Измерить в PresentMon интервал между кадрами обоих процессов, а если есть игровые логи, смотреть состояние фокуса окна и число обработанных пакетов за кадр
Подтверждает
Только в фоновом окне интервал между кадрами сильно растёт (при ограничении в драйвере выходит на плато на интервале, соответствующем заданной частоте кадров) или обработка останавливается, а если поменять окна местами, проблема переходит к другому клиенту
Опровергает
Если то же самое бывает и в окне на переднем плане, фоновые ограничения ни при чём. Если независимо от положения окна сбоит всегда один и тот же клиент, причина в разных настройках отображения или в несовпадении версий
Чем проверить
Проверка на стороне игрока
Источники
Application.runInBackgroundUnity runInBackground по умолчанию false, и в этом случае приложение в фоне ставится на паузу