Имитация лагов и потери пакетов в играх
Сетевой код пишут на локальном соединении с пингом 1 мс, а тестируют игроки в Wi-Fi отеля. Этот инструмент закрывает разрыв на вашей собственной машине, только для процесса игры, пока остальной компьютер остаётся пригодным для работы.
С чего начать
Нацельтесь на клиент игры, дайте ему реалистично плохое соединение и пусть он сам остановится через пять минут:
BeanNetworkTester.exe --latency 120 --jitter 60 --loss 3 --target mygame.exe --duration 300
Для этого есть и готовая временная шкала: overloaded-game-server.json в папке scenarios проводит соединение в перегрузку и обратно, чтобы вы увидели, как клиент справляется с обоими направлениями изменения. См. сценарии во времени.
Почему игра показывает потери, а браузер нет
Большинство игрового трафика идёт по UDP, а у UDP нет ничего, за чем можно спрятать потери. Веб-страница поверх TCP незаметно повторяет передачу и просто грузится дольше, поэтому браузер может чувствовать себя нормально при 5 % потерь, а матч при тех же 5 % подтормаживает, откатывается назад и рассинхронизируется.
Это делает игру честным местом для проверки потерь: то, что вы задали, клиент и переживает на самом деле.
Что задавать и что это проверяет
| Настройка | Попробуйте | Что выявляет |
|---|---|---|
| Задержка | от 80 до 250 мс | Предсказание и интерполяция. Откатывается ли ваш персонаж назад после выстрела? |
| Джиттер | от 40 до 100 мс | Буферизация. Стабильные 200 мс скрыть проще, чем пинг, который всё время прыгает. |
| Потери | от 2 до 10 % | Пропущенные обновления состояния и то, восстанавливается ли клиент или дрейфует. |
| Всплески | 1 секунда, редко | Зависание, которое вызывает передача между вышками. Обычно самое неприятное. |
| Канал то включается, то выключается | цикл 10 с, 30 % простоя | Переподключение и возвращение в игру. |
Измеряйте джиттер как разницу между 95-м перцентилем и медианой, а не как среднее: джиттер почти не двигает среднее, поэтому запуск на бумаге может выглядеть одинаково, а играться по-другому.
Для сравнения двух сборок нужен seed
Случайные потери делают два запуска разными, поэтому «новая сборка ощущается хуже» не доказательство. Один и тот же seed воспроизводит те же потери и тот же джиттер, и ощущение превращается в сравнение:
BeanNetworkTester.exe --latency 120 --jitter 60 --loss 5 --seed 42 --target mygame.exe --duration 180
Чего он не умеет
Он формирует трафик вашей машины. Он не замедляет сервер, не меняет его частоту тиков и не переводит других игроков на плохое соединение, поэтому проверяет ваш клиент на плохом канале, а не ваш сервер под нагрузкой. Для серверной стороны нужно нагрузочное тестирование, а для лобби, полного плохих соединений, нужна не одна машина.