한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › Архитектура синхронизации

Протокол с множеством последовательных обменов (chatty) Chatty protocol / sequential round trips

ID причины sy-chatty · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Если для одного действия нужно несколько обменов с сервером по очереди, пинг умножается на их число.

Почему Открытие магазина → запрос списка → проверка цены → покупка → обновление инвентаря, каждое отдельным запросом → Следствие Следующий запрос уходит только после ответа на предыдущий → На экране При пинге 150 ms одна покупка занимает почти 1 с. Загрузки подозрительно долгие

Симптомы
Задержка ввода, Ошибка входа / бесконечная загрузка
Факторы
Задержка
У кого
Только одна функция, Только у меня
Когда
При определённом действии, Сразу после входа или техработ
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: изменить протокол так, чтобы несколько шагов шли одним запросом и ответом (например, класть обновлённый инвентарь в ответ на покупку). Клиент: заранее загружать нужные данные, делать UI, который не ждёт результата.
Цифры для ориентира
Время ≈ число обменов × (пинг + обработка на сервере + ожидание тика). При 5 обменах и пинге 150 ms около 0,85–1 с.
На графике
Высоко с самого начала · время выполнения по функциям, число обменов на одно действие
Где смотреть
В захвате пакетов на стороне сервера (Wireshark) посчитать, сколько раз запросы и ответы сменяют друг друга за одно действие тестового аккаунта (покупка в магазине, вход) и с какими интервалами. Если есть лог запросов на сервере, сгруппировать по ID сессии и смотреть число запросов и время прихода и ответа каждого
Подтверждает
Одно действие состоит из нескольких последовательных запросов, каждый ждёт предыдущего ответа, время выполнения примерно равно числу обменов × RTT, и чем выше пинг в регионе игрока, тем пропорционально медленнее та же функция
Опровергает
Если обменов один-два, а долго идёт один ответ, причина в обработке на сервере или в БД. Если все игроки тормозят одинаково независимо от пинга, смотреть нагрузку на сервер
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. Chatty I/O antipattern Microsoft Azure
    Множество мелких запросов ввода-вывода накапливает задержку и сильно ухудшает отзывчивость. Рекомендуется объединять их в более крупные и редкие запросы

Смотрите также

Тот же слой: Архитектура синхронизации

Причины с тем же симптомом (Задержка ввода) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами