Как я оптимизировал мультиплеер в Unreal Engine вместе с ИИ, а потом исправлял за ним косяки

Кадр из Космической Одиссеи 2001 года.
Кадр из Космической Одиссеи 2001 года.

Такое ощущение, что сейчас бессмысленно писать технические статьи. В моем случае, про мультиплеер в Unreal Engine. Все уже давно написано, и как будто бы ничего не изменилось: Сетевая оптимизация для Unreal Engine 4, What Every Programmer Needs To Know About Game Networking, Making Fast‑Paced Multiplayer Networked Games is Hard. Если лень читать, попросите Чат ГПТ — он быстро по пунктам перескажет статью. Да, и вообще, Чат ГПТ сам вам расскажет, как все делать.

Но я думаю, есть смысл рассказать про свой личный опыт по оптимизации мультиплеера и что сейчас особенно актуально — по работе вместе с ИИ. Эта статья — не очередное нытье на тему: «ИИ заменит нас всех», а скорее нытье на тему: «ИИ заменит нас всех плюс мой опыт сетевой оптимизации и как ИИ помог (и не очень) мне в этом». Погнали

Начало

Как‑то так совпали две вещи: началась по истине массовая истерия в программистских кругах вокруг ИИ и мое желание реанимировать свой старый пет‑проект про мультиплеерные гонки на ховеркарах. Очень давно я пытался его оптимизировать, но тогда опыта в мультиплеере было мало, поэтому вышло как вышло:

https://www.youtube.com/watch?v=hIDivVLJD6U

Видео загрузить не удалось, поэтому вот Thumbnail
Видео загрузить не удалось, поэтому вот Thumbnail

Вроде неплохо, но по факту было допущено много ошибок. К тому же в самом редакторе Unreal Engine я неправильно настроил эмуляцию сети. В итоге в реальных условиях лаги остались, хоть и не такие заметные.

Сейчас я уже матерый прогер по мультиплееру в Unreal Engine и понимаю много вещей, о которых раньше даже не знал. Тем не менее оптимизировать мультиплеер в одной конкретной игре, хоть и не рокет саенс, но все равно требует время и усилий, и я ленился тратить свое свободное время на это.

Первые эксперименты с ИИ

Вайб‑кодинг когда появился? Год‑два назад. Тогда это все казалось шуткой. Я включал AI assistant в JetBrains Rider. Он вроде немножко экономил время, но как‑то раз так накуролесил (а я не заметил), что потом пришлось срочно фиксить его косяки. После этого я его отключил.

Также я использовал ChatGPT, когда подготавливал вопросы к собеседованию по Unreal Engine. Он мне хорошо помог, но его галлюцинации меня поражали. Часто придумывал несуществующие методы, допускал ошибки в рассуждениях. На серьезных щах пытался доказать, что он прав. Короче я снова подумал, что до использования ИИ в работе еще далеко. Это было, кстати, зимой.

Наконец, совсем недавно я дал ему второй шанс. Все говорили, что он очень умный. И я снова решил это проверить. У меня была проблема: дедикейтед сервер пускал клиентов через раз. Я день пытался дебажить, но безуспешно. Тогда я закинул километровый лог в чат гпт и мы с ним довольно быстро нашли проблему:

Диалог с ЧатГПТ
Диалог с ЧатГПТ

Я подумал: прикольно, но продолжил работать по старой схеме — всё сам. Лишь решил, что в следующий раз снова закину ему лог с ошибкой — снова поможет мне.

Переломная точка

Примерно месяц назад (да, я знаю, я слоупок) я общался с другом из Микрософта, он выражал беспокойство, что через пару лет всех программистов выставят на мороз. Я даже не подумал, что он всерьез говорит. Я ему рассказал, что я скармливаю логи ЧатуГПТ, и он помогает мне находить ошибки. Он ответил: что я еще на первом уровне понимания работы современных нейронок. У них в Микрософте все сервисы имеют MCP‑протоколы, везде работают агенты. Он даже баг‑трекер не открывает. Опус 5 делает все за него. Я отмахнулся — в Unreal Engine ничего такого нет.

Спустя неделю мой друг, тоже программист Unreal Engine, рассказал, как он в Курсоре за ночь написал плагин для репликации тысячи акторов для своей игры. За неделю он с ИИ делает то, что обычно за месяц делает целый отдел.

Наконец, я решил попробовать. Купил Claude подписку за 20 баксов, запустил десктопную версию и попросил ее помочь мне сделать client side replication на моем пет‑проекте. Она сделала все сама за полчаса. Я лишь корректировал ее работу в паре моментов. Правда, я пропустил один критический косяк, но об этом позже. Сам на новом проекте с кастомным movement я бы делал это неделю, а потом еще бы правил ошибки. Я был в шоке. Я как будто оказался в будущем. Последний раз я такое испытывал в году 2005м, когда увидел спутниковые Google Maps.

Примерно так я провел остаток дня, думая о будущем, в котором мы все оказались. Кадр из Людей в Черном.
Примерно так я провел остаток дня, думая о будущем, в котором мы все оказались. Кадр из Людей в Черном.

Галлюцинации

Все про них писали, но я еще не столкнулся на тот момент с ними. Итак, Claude Opus 5 написал мне client side prediction за полчаса. Круто! Я проверил — все работает отлично. Запустил эмуляцию плохой сети и заметил небольшую проблемку: ховеркар начинает немного поддергиваться. Так как проблема выявилась только со включенной эмуляцией плохой сети, я сразу погрешил на синхронизацию (reconciliation) серверного состояния с клиентским. Но даже не попытавшись найти проблему сам, я сразу отдал ее Клоду. И вот тут началось...

Клод предлагал различные правдоподобные гипотезы, мы их постоянно проверяли. Он добавлял логи, я запускал. Он снова предлагал новую гипотезу, добавлял логи, я запускал. Потом я даже записал видео. Ничего не помогало. Я попытался решить проблему с Codex — те же яйца, только в профиль. Они оба настолько убедительно говорили в чем проблема, что у меня даже не возникало сомнения.

Поиск ошибки. Я еще настроен оптимистично
Поиск ошибки. Я еще настроен оптимистично
Кодекс говорит, что он был неправ
Кодекс говорит, что он был неправ
Обсуждение продолжается
Обсуждение продолжается

Так продолжалось два дня. Два дня мы искали ошибку. Пока наконец, пелена не спала с моих глаз, и я не спросил себя. Я же программист, я сам могу найти ошибку. И вот, сделав то, что ИИ не умеет, а именно, включив логику, я методом исключения нашел в чем была проблема.

При обработке ввода с клиента, сервер вырезал Z‑компоненту из входного вектора. Я пропустил эту ошибку, потому что подумал, что все норм — ведь я управляю кораблем в двух координатах. Нашел я ее очень быстро — просто по очереди перебирая все шаги, которые делает сервер. ИИ так не умеет. Он не умеет анализировать сложные алгоритмы. Client‑side prediction описан миллион раз, он реализован в UCharacterMovementComponent в самом Unreal Engine. Его он воспроизвел с легкостью, а вот чтобы донастроить, мозгов ему не хватило.

Забавно, но когда я дал чату гпт проревьюить статью, он предложил переписать предыдущий абзац: «ИИ так не умеет. Он не умеет анализировать сложные алгоритмы». Я бы ослабил именно утверждение, но сохранил укол. Например, по смыслу: «И вот тут обнаружилась пока еще очень важная разница. ИИ отлично генерировал новые гипотезы, но не смог систематически пройти всю цепочку исполнения и методом исключения сузить проблему. Мне же оказалось достаточно последовательно проверить каждый этап.»

Простой вывод, который я сделал из этого: доверяй, но проверяй. Держи архитектуру и ключевые места в голове. Ты как программист должен все прекрасно понимать на всех уровнях абстракции. И нет — это не микроменеджмент, беда неопытных тим лидов. Это другое. Я могу отдать джуну этот алгоритм, пусть он с ним собачится, ищет ошибки. Не справится за неделю, поставим на карандаш. Я сделаю выводы, буду давать задачи попроще, а сложнее — миддлу. В случае нейронки, я за все отвечаю в конце концов. Я не могу сказать нейронке: «работай пока не найдешь ошибку». Она ничего не найдет, а я потрачу время и деньги.

Этот случай не отпугнул меня. Теперь я уже не откажусь от КЛОДа, ЧатаГПТ и прочих. Они делают меня 10х‑программистом (помните такой термин был лет 5–10 назад: «10x»?)

Я, после того как начал использовать нейронки в работе. Отсюда: https://programmerpaintings.org/
Я, после того как начал использовать нейронки в работе. Отсюда: https://programmerpaintings.org/

Оптимизация мультиплеера

Ну ладно, нейронки нейронками, но давайте я хоть немного расскажу про оптимизацию мультиплеера. Вкратце.

Пересказывать те статьи, что я привел в начале, не буду. Базовые оптимизации Unreal Engine бессмысленны без фундаментальной базы: сеть есть сеть. Можно до бесконечности уменьшать размеры пакетов, уменьшатьNetUpdateFrequency, но пинг останется. Даже с идеальным RTT в 40 мс и нулевыми потерями, в таких играх как гонки — отсутствие фундаментальной оптимизации будет видно сразу.

В итоге мой список:

  1. Преждевременная оптимизация — зло. NetUpdateFrequency, Relevancy, дорминант не дорминант и прочее — это преждевремнная оптимизация. Делать это надо в конце вместе с профайлером.

  2. Использовать только Reliable при активной разработке не страшно, даже каждый тик. Два игрока в локальной сети не повлияют на буфер пакетов, зато можно будет отложить тонкую настройку алгоритмов на более поздний этап. Главное не забыть об этом перед тем как отправлять в продакшн

  3. Сначала база: client‑side prediction, reconciliation, snapshot interpolation и прочее. Без этого никак.

Вот и все про оптимизацию.

Нужны ли программисты?

А теперь к вопросу, который набил уже всем оскомину. Но действительно очень актуальный. В этот раз это не просто хайп.

Лет 10 назад я прошел курс на Курсере Эндрю Ына про нейронные сети. Там по большей части была векторная алгебра, перемножение матриц, системы уравнений. Закончив его, я смог сам создать математическую модель, натренировать нейронку, а потом на джаве написать определитель игральных карт: масть и достоинство. В голове я подвел: «окей, я примерно знаю, как работают нейронки. Мне это не особо интересно, двигаемся дальше». Так вот, сейчас я не понимаю, как они работают. Для меня сейчас эта какая‑то фантастика. Я не понимаю, как она отвечает на вопрос: почему у нас в проекте Гуиды конвертятся неправильно. Особенно, когда она отвечает, что надо использовать другой юникод. Как она это выяснила?!

Пока что нейронки не умеют в сложные алгоритмы. Ключевое слово пока. А что будет через 3 года? Да ладно, три года, что будет через полгода?

Я сеньор/тимлид. Я не знаю, нужен ли я буду через 5 лет. Да, я не запускаю ракеты в космос, но все равно я и не CRUD‑сервисы клепаю. У меня нет четкого ответа на этот вопрос. Я думаю про офлайн. Надо перекочевывать туда. Virtual Production, например. И мой опыт не пропадет. ИИ туда еще не добрался.

Пока что

Бонус

В конце, я думаю, стоит все‑таки показать, что я там наоптимизировал:

https://www.youtube.com/watch?v=rJTq1AMDTG8


Если вам понравилось моя статья, подпишитесь на тг‑канал: Митя Мультиплеер. Новые подписчики мотивируют меня писать дальше.