Luanti. Хранение карты в опенсорсном Minecraft

Изучаем устройство Luanti: как данные мира хранятся в SQLite

1 мин на чтение

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 генерируется динамически по мере его исследования игроком. Каждый сгенерированный чанк сразу же сохраняется в базу данных. Это нужно для поддержания целостности мира, чтобы при следующей загрузке он выглядел так же. При изменении мира игроком сохранение в базу данных происходит с задержкой через определенный интервал времени. Оптимизация, куда без нее.

Как и когда данные читаются из базы?

Чтение мира из базы данных тоже выполняется чанками. Если чанк существует в базе, то он загружается, если нет - генерируется. При движении игрока по миру чанки автоматически подгружаются или генерируются.

Изменение структуры данных в 2025 году

Начиная с версии 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")
);

Свое решение разработчики объясняют упрощением запроса чанков по координатам, а также уходом от сложной логики свертки координат. Кому интересно, вот этот пул-реквест.


Свежие записи

Чему учиться в эпоху ИИ?

Чему учиться в эпоху ИИ?

Заметка по книге Букреева и ДеУолта “Эверест. Смертельное восхождение”

1 мин на чтение

Работать долго

Работать долго

Заметка по книге Нассима Талеба “Одураченные случайностью”

1 мин на чтение

Doc As Code: диаграммы PlantUML в Doxygen

Doc As Code: диаграммы PlantUML в Doxygen

Включаем поддержку UML-диаграмм в Doxygen и размышляем о последствиях

3 мин на чтение

Какие файлы нельзя коммитить в Git

Какие файлы нельзя коммитить в Git

Разбираемся, как не превратить репозиторий Git в Google-диск

3 мин на чтение

Зачем нужны UML диаграммы?

Зачем нужны UML диаграммы?

Выясняем, когда и для чего разработчики используют UML

3 мин на чтение