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

Такое ощущение, что сейчас бессмысленно писать технические статьи. В моем случае, про мультиплеер в 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

Вроде неплохо, но по факту было допущено много ошибок. К тому же в самом редакторе 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»?)

Оптимизация мультиплеера
Ну ладно, нейронки нейронками, но давайте я хоть немного расскажу про оптимизацию мультиплеера. Вкратце.
Пересказывать те статьи, что я привел в начале, не буду. Базовые оптимизации Unreal Engine бессмысленны без фундаментальной базы: сеть есть сеть. Можно до бесконечности уменьшать размеры пакетов, уменьшатьNetUpdateFrequency, но пинг останется. Даже с идеальным RTT в 40 мс и нулевыми потерями, в таких играх как гонки — отсутствие фундаментальной оптимизации будет видно сразу.
В итоге мой список:
Преждевременная оптимизация — зло. NetUpdateFrequency, Relevancy, дорминант не дорминант и прочее — это преждевремнная оптимизация. Делать это надо в конце вместе с профайлером.
Использовать только Reliable при активной разработке не страшно, даже каждый тик. Два игрока в локальной сети не повлияют на буфер пакетов, зато можно будет отложить тонкую настройку алгоритмов на более поздний этап. Главное не забыть об этом перед тем как отправлять в продакшн
Сначала база: client‑side prediction, reconciliation, snapshot interpolation и прочее. Без этого никак.
Вот и все про оптимизацию.
Нужны ли программисты?
А теперь к вопросу, который набил уже всем оскомину. Но действительно очень актуальный. В этот раз это не просто хайп.
Лет 10 назад я прошел курс на Курсере Эндрю Ына про нейронные сети. Там по большей части была векторная алгебра, перемножение матриц, системы уравнений. Закончив его, я смог сам создать математическую модель, натренировать нейронку, а потом на джаве написать определитель игральных карт: масть и достоинство. В голове я подвел: «окей, я примерно знаю, как работают нейронки. Мне это не особо интересно, двигаемся дальше». Так вот, сейчас я не понимаю, как они работают. Для меня сейчас эта какая‑то фантастика. Я не понимаю, как она отвечает на вопрос: почему у нас в проекте Гуиды конвертятся неправильно. Особенно, когда она отвечает, что надо использовать другой юникод. Как она это выяснила?!
Пока что нейронки не умеют в сложные алгоритмы. Ключевое слово пока. А что будет через 3 года? Да ладно, три года, что будет через полгода?
Я сеньор/тимлид. Я не знаю, нужен ли я буду через 5 лет. Да, я не запускаю ракеты в космос, но все равно я и не CRUD‑сервисы клепаю. У меня нет четкого ответа на этот вопрос. Я думаю про офлайн. Надо перекочевывать туда. Virtual Production, например. И мой опыт не пропадет. ИИ туда еще не добрался.
Пока что
Бонус
В конце, я думаю, стоит все‑таки показать, что я там наоптимизировал:
https://www.youtube.com/watch?v=rJTq1AMDTG8

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

