Данные мира: секции, колонки, сущности
На этой странице показано, как mcrs раскладывает мир в памяти: блоки лежат в секциях и колонках, а мобы - в строках таблицы. Для блоков раскладка устоялась, а для сущностей и для API доступа к миру еще меняется, поэтому страница короткая. Если вы знаете Paper, отличий два. “Чанк” здесь означает две разные вещи, а моб не объект.
Измерение состоит из колонок, колонка - из секций
Заголовок раздела «Измерение состоит из колонок, колонка - из секций»| Уровень | Размер | Для чего нужен |
|---|---|---|
| Секция | 16 x 16 x 16 блоков | единица хранения блоков, света и сжатия палитры |
| Колонка | 16 x высота x 16 блоков | вертикальная стопка секций; владеет картами высот |
| Измерение | без границ | верхний контейнер; владеет индексом колонок и индексом секций |
mcrs говорит “секция” и “колонка” и избегает голого слова “чанк”, потому что по нему не понять, какое из двух имеется в виду. Оба термина определены в глоссарии.
В движке каждый из трех уровней - сущность ECS с компонентом-маркером, который помечает, что это за сущность. Маркеры называются Section, Column и Dimension и лежат в mcrs_minecraft_engine_world. Типы позиций BlockPos, SectionPos и ColumnPos - обычная математика координат в mcrs_minecraft_core, состояния ECS в них нет. Данные блоков внутри секции хранятся в палитре в стиле PalettedContainer, как в игре.
Каждое измерение - отдельный мир Bevy со своим тиком. На этом строятся Ячейки и путь к многим узлам и плагины измерений, которые вы пишете по странице Измерения - отдельные миры.
Билеты решают, что горячее
Заголовок раздела «Билеты решают, что горячее»Пространство тикает, только когда его покрывает билет (ticket). Билет дают область симуляции игрока, область спавна или загрузчик чанков. Код держит билеты загрузки на колонках, трехмерные области симуляции игроков и стадию каждой секции в lifecycle/ в модуле мира. Холодное пространство - это данные, которые не тикают. Благодаря такому разделению нетронутая секция ничего не стоит.
Единым API для чтения мира становится volume
Заголовок раздела «Единым API для чтения мира становится volume»Сегодня блоки читают несколько путей кода, и каждый через свое представление: крейт чанков, генератор мира, движок освещения, построитель мешей и клиент. На “секция не загружена” каждый отвечает по-своему. Их по шагам заменяет один крейт слоя 3, mcrs_minecraft_volume.1
У volume есть границы. Про каждую секцию он сообщает, можно ли в нее писать, или она только для чтения, принадлежит другому владельцу, не загружена или лежит снаружи. При доступе ничего не загружается, а ошибки - это типы, по которым можно делать match.
Возможности вынесены в отдельные трейты для блоков, биомов, высот, света и блок-сущностей, и у них есть изменяемые формы. Трейты обобщенные, поэтому динамической диспетчеризации на каждый блок нет. Основной путь идет по секциям и палитрам, а доступ по одному блоку - курсор поверх этого пути.
Крейт уже есть и экспортирует эти типы. Вызывающий код переходит на него за семь шагов, перечисленных в issue, среди которых представление измерения в движке, высоты и биомы, снапшоты и свет, построение мешей и клиентское хранилище. Пока шаги не закончены, часть кода использует старые представления.
Мобы - это строки в хранилище по тайлам
Заголовок раздела «Мобы - это строки в хранилище по тайлам»Сущность Bevy на каждого моба была бы гибкой, но дорогой. Поэтому сущности, которые симулирует сервер, mcrs держит строками в хранилище по тайлам, в крейте mcrs_minecraft_entity_rows. У мобов есть плотная колонка горячего состояния. Предметы и сферы опыта - только строки, игроки тоже строки. На каждом тике один проход параллельно по тайлам обновляет каждую строку по замороженному снапшоту. Почему это дает один результат при любом числе потоков, объясняет страница Как тик работает параллельно.
Холодное состояние моба остается в ECS, в компонентах, которые может понадобиться читать из обычной системы. В заметке о дизайне такое разделение называется “гибридным”: горячее состояние в строках, холодное в компонентах. В ядре хранилища Bevy нет, а feature bevy превращает хранилище в ресурс.
Точная форма API, через который плагин читает и меняет эти строки, не определена. Решения по нему пока нет, поэтому описать его на стабильной странице нельзя. Стоимость памяти на секцию и на компонент сущности тоже не измерена.2
Дальше: Ячейки и путь к многим узлам.
Footnotes
Заголовок раздела «Footnotes»Источники и проверка
Проверено: 26.4-snapshot-7, 51d45c26a, 2026-11-09
Переведено с версии 51d45c26a