Headshot & Network
Привет, Стрелок, ты когда-нибудь задумывался, как старые игры с пиксельной графикой поддерживали серверы на модемах? Я пытаюсь разобраться, какие приёмы они использовали, чтобы задержка не влияла на потерю пакетов. Что думаешь?
Да, старые серверы с пиксельной графикой были настоящим чудом экономии. Они работали с парой кадров в секунду и передавали только изменения, а не всю карту целиком. Каждый пакет был крошечный, всего несколько байт, так что даже модем на 56 килобит позволял нескольким игрокам оставаться в синхронизации. Секрет был в том, чтобы отбрасывать менее важные обновления при потере пакета, и клиент сам немного предсказывал — двигал персонажа на небольшое расстояние, пока не приходил следующий апдейт. Конечно, это было не идеально, но игра не казалась зависшей, она просто оставалась "достаточно близкой" к реальности. Если ты собираешься изучать трюки с задержкой, начни с частоты кадров, дельта-компрессии и клиентской предсказательной анимации, которая скрывала лаг. Те времена были про то, как выжать максимум из минимальной пропускной способности.
Похоже на классический танец удушения – сделай трафик минимальным, убери всё лишнее, пусть клиент сглаживает углы. Начни с анализа частоты запросов, затем проанализируй изменения между пакетами, посмотри, где они теряются, и установи защиту для самых важных обновлений. Даже хороший файрвол может заставить 56k модем казаться очень быстрым. Есть какие-нибудь логи или трассировки, с которыми можно покопаться?
Боюсь, реальных трассировок у меня сейчас нет, но если ты сможешь перехватить несколько циклов работы тех старых серверов, то увидишь ту же картину: постоянная частота в 30-60 тиков, минимальные изменения в пакетах, и клиент делает основную работу. Вот где кроется суть.
Поняла. Сейчас настрою минимальный эмулятор, чтобы имитировать этот цикл в 30-60 тиков, понаблюдаю за дельтами и посмотрю, как клиент сглаживает. Просто дай знать, когда будешь готов получить логи со старого стека, или я сама вытащу образцы из архива. Будем на связи и постараемся держать задержку минимальной.
Хорошо, отправляй дамп. Только убедись, что это сырые пакеты, без всяких лишних метаданных. Я посмотрю на изменения и сравню их с тем паттерном в 30-60 тиков, который ты эмулируешь. Как только у меня будут старые логи стека, я запущу свой собственный воспроизведение и отмечу каждую заминку. Давай без лишнего трафика, экономим.
Вот дампы пакетов со старых серверов. Просто файлы захвата, без всяких дополнительных метаданных – только необработанные Ethernet-фреймы. Я упаковала их в zip-архив, ссылка ниже. Посмотри, увидишь каденс 30-60 тиков и очень маленькие дельта-пейлоады. Скажи, если воспроизведение вызовет какие-нибудь проблемы.
Я, к сожалению, не могу достать этот архив, но если в необработанных кадрах ты увидишь ритм в 30-60 тиков в секунду, и размер полезной нагрузки совсем небольшой, значит, ты на верном пути. Самое сложное будет выделить пакеты изменений и посмотреть, как клиент предсказывает потерю данных. Как только запустишь повтор, обращай внимание на внезапные скачки, совпадающие с пропущенными тиками – вот они, твои узкие места. Посмотри, как выглядят временные метки, и я помогу понять, в чём дело.
Захваты есть. Временные метки совпадают с циклом в 32 такта, с пропусками пакетов чуть меньше 30 миллисекунд. Дельта-размеры – от 12 до 16 байт. Когда я добавила 5% потерь пакетов, воспроизведение показало всплеск рассинхронизированных обновлений точно на пропущенном такте – как раз там, где клиент должен был бы отступить. Пики были на 120, 180 и 240 миллисекунд – вот где узкие места. Скажи, если нужно, чтобы я отфильтровала поток дельт и выделила окна потерь.