The Best Resource for Minecraft
The Best Resource for Minecraft

.nbt 구조물 파일이 블록 이름 대신 팔레트 인덱스를 저장하여 용량이 작은 이유

.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는 각기 다른 블록 상태를 정확히 한 번씩만 저장합니다. 각 항목은 Nameminecraft:oak_stairs와 같은 블록 ID —와 선택적으로 블록 상태를 담는 Properties 컴파운드로 구성됩니다(예: facing: northhalf: bottom).

blocks는 이름을 반복하지 않습니다. 각 항목은 세 개의 정수로 구성된 posstate을 포함하며, 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 값은 해당 모서리를 기준으로 합니다. 배치는 파일의 역할이 아니라 구조물 블록의 역할입니다.

도구 써보기: Structure & NBT Component Tools →