Рождение каркаса: FastAPI, костыли интерполяции и призраки ММО (AI-Evolution #1)

Рождение каркаса: FastAPI, костыли интерполяции и призраки ММО (AI-Evolution #1)

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

Наверное, в 90% подобных случаев возникает мысль написать приложение для анализа и предсказания цен на финансовых рынках или чего-то в этом роде. И хотя тема в этом плане хорошая, я не хотел заниматься тем, к чему душа не лежит. Немного подумав, я решил, что симуляция жизни будет неплохим проектом. Пусть это не самое полезное, что можно придумать, но именно этим лично мне интересно заниматься.

Я набросал простенькую страничку на React и базовый прототип программы. Ну как... «прототип» — сильно сказано. По сути, просто сделал так, чтобы по экрану бегал «агент» и натыкался на «кустик». Это служило скорее проверкой работоспособности.

Я довольно быстро понял, что для нормальной симуляции JavaScript не подойдет, поэтому выбор пал на написание бэкенда на Python. Я выбрал этот язык, потому что в учебнике, по которому я изучаю нейросети, используется именно он. Не стал долго размышлять, правильно это или нет: в любом случае для меня это новый инструмент, и освоить его — отличный навык.

С помощью нейронки я набросал простенький сервер. Для справки: нейросетью я пользуюсь часто, но не для того, чтобы бездумно копировать выдаваемый код. К тому же такой подход довольно быстро заводит в тупик. Время от времени, общаясь с ИИ, я замечал, что если диалог разрастается до огромных масштабов, он начинает путаться в контексте, забывать вещи, и чат приходится обновлять. А в новом чате нужно объяснять контекст заново. И если я буду просто копировать код, то в будущем, только чтобы ввести ИИ в курс дела, придется тратить кучу времени и сил, которые, скорее всего, не окупятся. Я знаю, что есть более продвинутые системы, но, как я уже говорил, я хочу сам разобраться в том, что делаю, а не просто получить готовый результат. Поэтому с нейронкой я общаюсь скорее для того, чтобы лучше обрисовать концепцию, дальнейшие шаги, подсветить слепые пятна и так далее.

В общем, я набросал простенький сервер, создал классы агента и куста с едой и... столкнулся с первой проблемой. Сделал так, чтобы сервер отправлял данные на фронтенд с частотой 2 Гц (два раза в секунду). Проблема — синхронизация положения агента на бэке и на фронте. Сначала я просто передавал данные с бэкенда. Ожидаемо, агент дважды в секунду просто скакал по полю. Меня этот вариант не устраивал.

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

Но утром, проснувшись, я задался вопросом: «А как в ММО обеспечивают плавное движение персонажей по экрану?» Немного покопавшись, я наткнулся на такую штуку, как LERP — линейная интерполяция. Суть примерно та же, что я использовал в первый раз для сглаживания, но чуть более продвинутая. В принципе, совсем со скачками справиться еще не получилось, но сами по себе они стали плавнее — как будто агент передвигается вприпрыжку. Сейчас я прочитал про Snapshot Interpolation (интерполяцию снимков состояния). Дальше попробую реализовать передвижение через нее. Посмотрим, что получится.

1