Система работает так....на каждый регион существует объект, содержащий:
4*КУБ баит - палитра блоков
4*КУБ баит - палитра покрытий
262144 баита - HeightMap (256 баит на каждый чанк)
262144 баита - блоки
262144 баита - покрытие
4*КУД баит - палитра деревьев
4*КУО баит - палитра объектов
128 баит - кэш, сообщающий о наличии объектов, пересекающихся с чанками (для ускорения выборки)
N баит - список врапперов деревьев
N баит - список врапперов объектов
Враппер обьъекта/дерева:
6 баит - координаты внутри региона
4 баита - ссылка на объект
1 баит - поворот
N баит - список блоков, которые могут быть разрушаемы/изменяемы (стекла, двери и т.д.)
Сам объект:
6 баит - размер по x,y,z
4*КУБ баит - палитра
x*y*z баит - массив блоков
Сервер выбирает блок так:
1. Находит объект региона
2. Делает выборку из HeightMap (по локальным x,z выбирает высоту)
3. Если y ниже высоты, то, если y==0 - бедрок, в противном случае камень
4. Проверяет, есть ли пересекающиеся объекты
5. Если есть объекты, то находит враппер объекта, вычилсяет оффсет и выбирает соответствующий блок из объекта
6. Если объектов нет или из объекта выбран воздух, то, если y==высота - возвращает блок, если выше - проверка и выборка покрытия
Элемент палитры покрытия может содержать как одинарный блок, так и несколько стоящих друг над другом блоков (кактусы, высокая трава, заборы), так и столб воды
И получается, что большинство чанков весят жалкие 768 баит (256 на HeightMap, 256 на блоки и 256 на покрытия) + возможно, придется добавить 256 баит копий покрытий, чтобы реализовать их разрушаемость
Лысая карта в 262144 чанка без деревьев и объектов будет весить 192мб + максимум 1мб на палитры и прочую лабуду
Строители действют так:
1. Строят ландшафт, дороги, заборы и прочую мелочь. Заливают водоемы. Но карта на этом этапе должна быть плоская (не считая воду и растительность)
2. На отдельном сервере строят шаблоны деревьев и объектов
3. Лысая карта и шаблоны конвертируются в собственный формат
4. Далее им остается летать по карте и в один клик расставлять маркеры деревьев/объектов
На выходе имеем подобное
https://clip2net.com/s/3VdyPel https://clip2net.com/s/3Vdz9mp https://clip2net.com/s/3Vdzkt2
Лоды генерируются на лету и сжимаются. Для такой огромной карты вес, всего, 1.5мб