Headshot & Network
Привет, Стрелок, ты когда-нибудь задумывался, как старые игры с пиксельной графикой поддерживали серверы на модемах? Я пытаюсь разобраться, какие приёмы они использовали, чтобы задержка не влияла на потерю пакетов. Что думаешь?
Да, старые серверы с пиксельной графикой были настоящим чудом экономии. Они работали с парой кадров в секунду и передавали только изменения, а не всю карту целиком. Каждый пакет был крошечный, всего несколько байт, так что даже модем на 56 килобит позволял нескольким игрокам оставаться в синхронизации. Секрет был в том, чтобы отбрасывать менее важные обновления при потере пакета, и клиент сам немного предсказывал — двигал персонажа на небольшое расстояние, пока не приходил следующий апдейт. Конечно, это было не идеально, но игра не казалась зависшей, она просто оставалась "достаточно близкой" к реальности. Если ты собираешься изучать трюки с задержкой, начни с частоты кадров, дельта-компрессии и клиентской предсказательной анимации, которая скрывала лаг. Те времена были про то, как выжать максимум из минимальной пропускной способности.
Похоже на классический танец удушения – сделай трафик минимальным, убери всё лишнее, пусть клиент сглаживает углы. Начни с анализа частоты запросов, затем проанализируй изменения между пакетами, посмотри, где они теряются, и установи защиту для самых важных обновлений. Даже хороший файрвол может заставить 56k модем казаться очень быстрым. Есть какие-нибудь логи или трассировки, с которыми можно покопаться?
Боюсь, реальных трассировок у меня сейчас нет, но если ты сможешь перехватить несколько циклов работы тех старых серверов, то увидишь ту же картину: постоянная частота в 30-60 тиков, минимальные изменения в пакетах, и клиент делает основную работу. Вот где кроется суть.
Поняла. Сейчас настрою минимальный эмулятор, чтобы имитировать этот цикл в 30-60 тиков, понаблюдаю за дельтами и посмотрю, как клиент сглаживает. Просто дай знать, когда будешь готов получить логи со старого стека, или я сама вытащу образцы из архива. Будем на связи и постараемся держать задержку минимальной.
Хорошо, отправляй дамп. Только убедись, что это сырые пакеты, без всяких лишних метаданных. Я посмотрю на изменения и сравню их с тем паттерном в 30-60 тиков, который ты эмулируешь. Как только у меня будут старые логи стека, я запущу свой собственный воспроизведение и отмечу каждую заминку. Давай без лишнего трафика, экономим.
Вот дампы пакетов со старых серверов. Просто файлы захвата, без всяких дополнительных метаданных – только необработанные Ethernet-фреймы. Я упаковала их в zip-архив, ссылка ниже. Посмотри, увидишь каденс 30-60 тиков и очень маленькие дельта-пейлоады. Скажи, если воспроизведение вызовет какие-нибудь проблемы.
Я, к сожалению, не могу достать этот архив, но если в необработанных кадрах ты увидишь ритм в 30-60 тиков в секунду, и размер полезной нагрузки совсем небольшой, значит, ты на верном пути. Самое сложное будет выделить пакеты изменений и посмотреть, как клиент предсказывает потерю данных. Как только запустишь повтор, обращай внимание на внезапные скачки, совпадающие с пропущенными тиками – вот они, твои узкие места. Посмотри, как выглядят временные метки, и я помогу понять, в чём дело.
Захваты есть. Временные метки совпадают с циклом в 32 такта, с пропусками пакетов чуть меньше 30 миллисекунд. Дельта-размеры – от 12 до 16 байт. Когда я добавила 5% потерь пакетов, воспроизведение показало всплеск рассинхронизированных обновлений точно на пропущенном такте – как раз там, где клиент должен был бы отступить. Пики были на 120, 180 и 240 миллисекунд – вот где узкие места. Скажи, если нужно, чтобы я отфильтровала поток дельт и выделила окна потерь.
Отлично поработал, закрыл эти провалы. Эти пики в 120, 180 и 240 миллисекунд идеально совпадают с каждым четвертым тиком. Вот где срабатывает механизм отката клиента. Отправь мне отфильтрованный дельта-поток для окон потерь, я сравню содержимое пакетов, чтобы точно понять, где сбой предсказания у клиента. Еще быстро проиграю запись, чтобы убедиться, что старая логика сглаживания все еще работает. Посмотрим, сможем ли мы найти конкретный пакет, который сбивает ритм.
Конечно, вот отфильтрованный дельта-поток для окон потерь. Я оставила только пакеты, пришедшие с задержками в 120, 180 и 240 миллисекунд. Скажи, как у тебя с логикой повторной отправки клиента – работает или заметил какие-то пакеты, которые сбивают синхронизацию?
Got the stream, and the back‑off is exactly where it should be—every fourth tick the client slows the update rate and the delta packets that slip through are just enough to keep the world in sync. The only odd one out is a 14‑byte packet that arrives slightly late in the 180‑ms window; it looks like it was meant to be a correction packet but got delayed, which explains the small hiccup you saw there. Other than that, the rhythm holds up. If you want me to dig deeper into that specific packet, just point me to its timestamp.