調色板
介紹 Minecraft 1.12.2 子區塊內的調色板系統,解釋 BlockState 與 bits 映射的原理與程式實作
調色板 (palette)
在 1.12.2 中,minecraft chunk 中又在細分 16 個子區塊 (sub-chunk),每個子區塊有 16 個方塊層 (block layer),每個方塊層有 16x16x16(4096) 的方塊。
而調色板的功能,就是一個將方塊狀態映射到數字的一種東西,他使的子區塊的方塊狀態能夠按照一定的順序排列成一個數字陣列,從而保存,對於包含不同狀態數量的紫區塊,遊戲會選擇使用不同的調色板類型來儲存方塊狀態。
Chunk.java
方塊狀態數 | bits | 調色板類型 | 備註 |
---|---|---|---|
1~16 | 4 | 線性調色板 (BlockStatePaletteLinear) | bits <= 4 強制固定 4 bits,不會用 1,2,3 bits |
17~32 | 5 | 哈希調色板 (BlockStatePaletteHashMap) | 使用 HashMap,查找成本略高於線性,但支援動態擴充。狀態數落在此區間時分配 5 bits。 |
33~64 | 6 | 哈希調色板 (BlockStatePaletteHashMap) | 同上,當狀態數超過 32 會自動升級至 6 bits |
65~128 | 7 | 哈希調色板 (BlockStatePaletteHashMap) | 同上,當狀態數超過 64 會自動升級至 7 bits |
129~256 | 8 | 哈希調色板 (BlockStatePaletteHashMap) | HashMap 的上限,最多支援 256 種狀態,對應 8 bits 編碼 |
>= 257 | 9+ | 註冊表調色板 (REGISTRY_BASED_PALETTE) | 直接用全域 Block.BLOCK_STATE_IDS ,bits 會依實際註冊數量計算 (預設 HashTableSize 為 512 ()) |
BlockStateContainer.java
線性調色板 (BlockStatePaletteLinear)
BlockStatePaletteLinear.java
哈希調色板 (BlockStatePaletteHashMap)
BlockStatePaletteHashMap.java