Чему учиться в эпоху ИИ?
Заметка по книге Букреева и ДеУолта “Эверест. Смертельное восхождение”
Luanti - это опенсорсный аналог Minecraft, написанный на C++. Мощный проект, к которому можно заглянуть под капот.
Кто не в курсе, Minecraft (и Luanti) - это компьютерная игра с открытым миром из кубических блоков, где можно свободно строить свои миры.
Мне в первую очередь было интересно как хранятся данные мира. Ведь мир свободный и большой. Казалось, простых решений тут быть не может. Но на самом деле решение довольно элегантное.
В Luanti данные мира хранятся в единственной базе данных SQLite в единственной таблице blocks:
CREATE TABLE "blocks" (
"pos" INT NOT NULL PRIMARY KEY,
"data" BLOB);
Каждая строка таблицы - это чанк (множество блоков) размером 16×16×16 блоков. Информация о состоянии каждого из 4096 блоков чанка хранится в специальной структуре в поле data. А поле pos хранит свертку координат x, y, z, определяющих положение данного чанка в пространстве.
Мир в Luanti генерируется динамически по мере его исследования игроком. Каждый сгенерированный чанк сразу же сохраняется в базу данных. Это нужно для поддержания целостности мира, чтобы при следующей загрузке он выглядел так же. При изменении мира игроком сохранение в базу данных происходит с задержкой через определенный интервал времени. Оптимизация, куда без нее.
Чтение мира из базы данных тоже выполняется чанками. Если чанк существует в базе, то он загружается, если нет - генерируется. При движении игрока по миру чанки автоматически подгружаются или генерируются.
Начиная с версии 5.12, координаты чанков хранятся в отдельных полях x, y, z таблицы blocks. От свертки координат pos отказались:
CREATE TABLE "blocks" (
"x" INTEGER, "y" INTEGER, "z" INTEGER,
"data" BLOB NOT NULL,
PRIMARY KEY ("x", "z", "y")
);
Свое решение разработчики объясняют упрощением запроса чанков по координатам, а также уходом от сложной логики свертки координат. Кому интересно, вот этот пул-реквест.
Заметка по книге Букреева и ДеУолта “Эверест. Смертельное восхождение”
Заметка по книге Нассима Талеба “Одураченные случайностью”
Включаем поддержку UML-диаграмм в Doxygen и размышляем о последствиях
Разбираемся, как не превратить репозиторий Git в Google-диск
Выясняем, когда и для чего разработчики используют UML