.nbt 구조물 파일이 블록 이름 대신 팔레트 인덱스를 저장하여 용량이 작은 이유
구조물 전체를 담는 세 가지 핵심 요소: 크기, 팔레트, 블록. 각 블록은 팔레트를 가리키는 정수이므로, 32³ 크기의 돌 블록은 실 하나와 32,768개의 숫자로 저장됩니다.
.nbt 구조물 파일 — 구조물 블록이 저장하고 데이터 팩이 배포하는 파일 —은 겉보기보다 훨씬 간단한 형식입니다. 구조물에 필요한 모든 정보는 몇 개의 최상위 키에 담겨 있으며, 파일 용량이 작은 이유는 하나의 설계 결정으로 설명됩니다.
구조물을 담는 세 가지 핵심 키
size [x, y, z] — a list of exactly three integers
palette [ { Name, Properties } … ] — every DISTINCT block state, once
blocks [ { pos, state, nbt } … ] — one entry per placed block
palette는 각기 다른 블록 상태를 정확히 한 번씩만 저장합니다. 각 항목은 Name — minecraft:oak_stairs와 같은 블록 ID —와 선택적으로 블록 상태를 담는 Properties 컴파운드로 구성됩니다(예: facing: north 및 half: bottom).
blocks는 이름을 반복하지 않습니다. 각 항목은 세 개의 정수로 구성된 pos와 state을 포함하며, state은 블록 ID가 아닌 팔레트의 인덱스입니다. 북쪽을 향하는 참나무 계단은 한 번만 문자열 데이터로 저장되고, 그 이후의 모든 참나무 계단은 작은 정수로 저장됩니다.
이것이 핵심입니다. 32 × 32 × 32 크기의 평범한 돌 블록은 팔레트 항목 하나와 32,768개의 인덱스 번호로 저장됩니다. 즉, minecraft:stone라는 단어가 32,768번 반복되는 것이 아닙니다. 팔레트는 여러분이 사용한 서로 다른 블록의 종류에 따라 커지고, 블록 목록은 여러분이 만든 구조물의 크기에 따라 커집니다. 이 두 숫자는 매우 다르며, 일반적으로 둘 중 하나만 큰 값을 가집니다.
설계 시 고려할 만한 두 가지 결과
블록 상태는 블록 목록이 아닌 팔레트를 늘립니다. 참나무 계단은 하나의 팔레트 항목이 아닙니다. 실제로 사용한 방향마다 하나의 항목이 됩니다. 네 방향, 위쪽 및 아래쪽 절반, 직선형, 그리고 안쪽 및 바깥쪽 코너: 동일한 블록이 수십 개의 팔레트 슬롯을 차지할 수 있습니다. 따라서 세부적인 구조물은 크기에 관계없이 팔레트가 크고, 단순한 구조물은 그렇지 않습니다.
배치된 블록만 항목을 가집니다. 블록 목록은 밀집된 3D 배열이 아닌 목록이며, 존재하지 않는 항목은 단순히 존재하지 않습니다. 이 페이지의 뷰어는 그리드를 -1으로 채우고 누락된 좌표를 배치되지 않은 것으로 처리합니다. 속이 빈 구조물은 동일한 크기의 속이 꽉 찬 구조물보다 저장 비용이 훨씬 저렴합니다.
nbt는 블록별로 선택 사항입니다.
blocks의 각 항목은 자체 nbt 컴파운드를 가질 수 있으며, 대부분은 그렇지 않습니다. 이곳에 상자의 내용물, 표지판의 텍스트, 스포너의 몹, 현수막의 패턴이 저장됩니다. 이는 팔레트가 아닌 개별 블록에 첨부됩니다.
이러한 구분은 중요합니다. 팔레트 데이터는 공유되지만 블록 데이터는 그렇지 않습니다. 두 개의 상자는 동일한 블록 상태이므로 하나의 팔레트 항목입니다. 하지만 각 상자는 자체 nbt에 자체 인벤토리를 유지합니다. 블록 상태를 변경하면 팔레트에 영향을 미치고, 내용물을 변경하면 블록 목록의 한 항목에 영향을 미칩니다.
한 번에 한 레이어씩 읽기
여기 뷰어는 의도적으로 2D입니다. 레이어 y를 그리기 위해 블록 목록을 탐색하고, pos[1]이 y와 같은 항목을 유지하며, 각 항목의 state를 팔레트에서 찾습니다. 이것이 전체 알고리즘이며, 여러분이 직접 이 파일들을 검사하는 방법이기도 하므로 알아둘 가치가 있습니다. 공간 인덱스를 구축할 필요도 없고 gzip 래퍼 외에 압축 해제도 필요 없습니다. 이 형식은 필터링할 수 있는 평면 목록입니다.
이는 또한 구조물 파일이 월드 내에서 어디에 속하는지에 대한 정보를 제공하지 않는다는 것을 의미합니다. size은 경계 상자이며 pos 값은 해당 모서리를 기준으로 합니다. 배치는 파일의 역할이 아니라 구조물 블록의 역할입니다.