AI-Evolution #4. Внедряю пространственное хэширование и делю логику с физикой

Добро пожаловать в на следующую страницу дневника разработки.

Пространственное хэширование.

Проект развивается, растет и сложность поведения агентов. Потихоньку навожу порядок "под капотом" проекта. В прошлый раз остановились на том, что я хотел поделить поле на ячейки.

Наконец сделал пространственное хэширование, теперь поле красиво поделено на клетки. Но дело тут не только в красоте. Это значительно уменьшит нагрузку на процессор при увеличении количества объектов на поле.

До этого, чтобы вычислить расстояние агенту до куста, ему нужно было считать расстояние до каждого куста. Скажем если кустов 10, а агентов 5, то каждый тик процессор считал 5 * 10 = 50 операций. А если агентов с кустами станет по 100? это уже 100 * 100 = 10000 операций. "А если..." №2: точнее, "когда": когда я введу систему отношений между агентами, это уже 100 * (100 + 100) = 20000 случаев. В общем вы надеюсь поняли что это было необходимым нововведением. Теперь агенту не нужно перебирать все кусты на карте. Он просто "смотрит" в свою клетку и 8 соседних, и считает расстояние только до тех объектов, которые там находятся. Размер клетки я выбрал равным радиусу обзора агента равным 100px. Сейчас это работает идеально. Однако в будущем систему придется доработать, так как я планирую сделать радиус обзора динамическим (наследуемым) признаком.

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

Кстати, при выборе агента теперь подсвечиваются его соседние клетки. Это сделано больше для красоты, но выглядит приятно и информативно.

При усложнении логики поведения агента возникла ситуация, что я попытался вызвать метод update у агента дважды, и в этот момент я узнал что так делать нельзя – у агента все действия будут расчитываться в два раза быстрее – срок жизни, метаболизм, движение и т.п. И я решил разделить логику агента и его физику (точнее, разделить это для любого объекта, требующего вычислений и отрисовки). Попутно рос и объем кода, разбираться в котором становилось все сложнее. Вечером у меня уже мозг плавился, как мне неприятно было на это смотреть и разбираться в этом. Но с утра пришла мысль все это систематизировать на более мелкие локальные функции.

AI-Evolution #4. Внедряю пространственное хэширование и делю логику с физикой

И немного отходя от разработки: теперь дневники будут выходить чуть пореже. Во-первых, потому что поначалу проект шел довольно быстро. Фундамент закладывать было не так уж долго. Во-вторых, публиковать дневник я решил не сразу. Это скорее были технические записи на будущее для самого себя, чтобы в определенный момент оглянуться и посмотреть на пройденный путь. Но потом подумал, что из этого может получиться неплохой контент для сообщества и решил выложить их в сеть. Сейчас я словно вернулся в WoW, докачался до 6го уровня и готов покинуть Нортширское аббатство и выйти в Элвинский лес 😊

Пока писал каркас приложения, несложно было составить план разработки. Сейчас же я все чаще ловлю себя на «параличе выбора» и не знаю, за что хвататься. Например, вот недавно… следите за мыслью:

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

· Энергия и экономика: Раз будет деление, нужно проработать баланс. Сейчас кусты спавнятся бесконечно. Если агенты заполонят поле, еды на всех не хватит, и они начнут умирать...

· Смерть: умирать… а агенты у меня пока не умеют умирать. Да, шкала энергии есть, но логика при достижении 0 не прописана.

· Механика гибели: Как они должны погибать? Просто исчезать с поля или оставлять трупы? А может, сделать так, чтобы через время на месте трупа вырастал новый куст?

· А может... А может... А может...

В общем, буду принудительно выбирать себе по одной задаче и потихоньку-полегоньку двигаться дальше.

AI-Evolution #4. Внедряю пространственное хэширование и делю логику с физикой

Кстати, тут обращусь к вам с вопросом, вдруг кому-то действительно интересно – стоит ли выкладывать дневники почаще? Я постараюсь слишком воду не лить, но ожидаемо будут не слишком длинные и информативные. Или лучше писать по мере того, как мир будет достаточно развит для нормальной статьи?

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

Притча о Девяти Наделах и Бескрайнем Лесе

В эпоху Воюющих царств правитель княжества Ци решил упорядочить сбор налогов и управление землями. Он приказал разбить бескрайние дикие луга на ровные квадратные наделы, чтобы стражам было легче считать повозки с зерном.

Сетку начертили, дороги проложили, но вскоре правитель впал в глубокое уныние. Он часами сидел на веранде дворца, смотрел на бескрайние просторы и не мог заставить себя подписать ни один указ. Наблюдая за его печалью, Мастер Ли принес во дворец старую бамбуковую раму, разделенную нитями на девять малых ячеек.

Мудрец положил раму на карту земель так, чтобы главный дозорный пост оказался ровно посередине. — Посмотри, о Великий, — сказал Ли. — Когда твой стражник стоит на посту, он не может и не должен знать, что происходит на дальних рубежах у границ царства. Но он обязан видеть свой надел и восемь соседних, что окружают его. Девять клеток — это всё, что нужно его взору, чтобы вовремя заметить повозку, не тратя силы на бессмысленный бег к горизонту. Пространство обрело порядок, и суета отступила.

Правитель вздохнул, отодвинул бамбуковую раму и покачал головой: — Твоя разметка принесла порядок на земли, Мастер Ли, но она породила хаос в моей голове. — Что тревожит тебя? — спросил мудрец.

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

Мастер Ли улыбнулся, взял со стола чистый свиток и развернул лишь малую его часть, остальной рулон оставив перевязанным шелковой лентой. — Ты пытаешься соткать весь Великий Круговорот за один день, правитель. Но посмотри на этот свиток: если ты развернешь его весь разом, он упадет со стола и покроется пылью. Твой ум уже разделил земли на наделы, так раздели же на наделы и свои думы. Не пытайся объять весь закон природы сразу. Выбери одно простое дело. Пусть сначала они научатся просто делиться. Когда амбары заполнятся — мир сам подскажет тебе, как именно они должны увядать.

Правитель Ци послушал совета. Он перестал пытаться удержать в голове всю вселенную, наметил задачу на ближайший день и вернулся к трудам, обретя глубокое умиротворение.

Узнав об этом, Конфуций записал в свои свитки:

«Благородный муж, выходя из тихой обители в большой лес, не пытается срубить все деревья разом. Он намечает путь по девяти клеткам своего горизонта. Тот же, кто пытается разгадать весь круговорот бытия до того, как сделан первый шаг, подобен путнику, который застыл на развилке дорог и ждет, пока рассеется туман над всей Поднебесной».

AI-Evolution #4. Внедряю пространственное хэширование и делю логику с физикой