layer | grids | memory | side(单位米) | desc |
---|---|---|---|---|
0: | 1x1 | 1 KB | 10485.76 | 最顶层,一个大格子,仅当某个区块跨整个大地图时该层才可能有数据。 |
1: | 2x2 | 1 KB | 5242.88 | |
2: | 4x4 | 1 KB | 2621.44 | |
3: | 8x8 | 1 KB | 1310.72 | |
4: | 16x16 | 1 KB | 655.36 | |
5: | 32x32 | 1 KB | 327.68 | |
6: | 64x64 | 1 KB | 163.84 | |
7: | 128x128 | 4 KB | 81.92 | |
8: | 256x256 | 16 KB | 40.96 | |
9: | 512x512 | 64 KB | 20.48 | 服务器最小单元格在这层,20.48 米 |
10: | 1024x1024 | 256 KB | 10.24 | |
11: | 2048x2048 | 1024 KB | 5.12 | |
12: | 4096x4096 | 4 MB | 2.56 | |
13: | 8192x8192 | 16 MB | 1.28 | 客户端最小单元格在这层,1.28 米 |
stageSn/{region-name}.data.bin 文件内容:
-
第一段、记录数据偏移: 前 32byte,每 2byte 为一个数据单位,表示一个数字,第几个该数据单位就表示第几层, 例如第 14 个数据单位其 2byte 的二进制为:0b0101010101011011, 则表示序号 14 层的数据开始于该二进制文件中偏移量为 21851KB 处。 因为当前有 14 层,所以该数据单位重复 14 次,以表示从序号 1 到序号 14 的各层数据。 注意,这一段记录数据偏移的二进制位本身不算入偏移量。
-
第二段、记录各层数据: 若该层没有数据,则直接跳过,不占据任何二进制位。
否则根据该层大小和数据密度划定一个瓦片图块尺寸,尺寸为 2 的 N 次方,N 小于等于 15,用 1byte 的二进制位记录下 N。 例如某层瓦片图块尺寸划定为 16x16,16 为 2 的 4 次方,则该层数据图块标识记录为:0b00000100。
定义每个单元格可能有三种状态:
- 0b00 代表默认、未知,即需要进一步查更深一层的格子。
- 0b01 代表该格完全位于区域内,无需进一步查深层。
- 0b10 代表该格子完全位于区域外,无需进一步查深层。
接下来按先 x 后 y 的顺序遍历瓦片图块,每个图块内的数据按以下规则继续处理:
- 若该图块中存在多种数据状态,则按先 x(横向)后 y(纵向)的顺序,完整记录各单元格状态,状态占两个 bit,即前面定义的 0b00, 0b01, 0b10。
- 若该图块中数据状态一致,则先存入一个标识符 0b11,然后若该图块后还有状态一致的图块,则再存入一个标识符 0b110 并接着存入 7bit 代表之后连续的图块数(不计当前图块),若图块数超过 127 可重复该步骤直到后续没有连续状态的图块了,最后存入两位二进制代表状态。
- 最后,每层数据需要对齐到 1KB,若小于 1KB 则需要用 0b11111... 填充,以便减小前面第一段提到的偏移量的数字大小。正常来说只要填充至少 5 个 1,就不会和其他情况冲突,后续可以略过或填充 0。
文件内容示例:
<0o{16}> ...(共 14 个) # 前 32byte,每 2byte 构成一个数据单位,记录数据偏移
<0b{0}> # 某层无数据,不占任何二进制位
<0b{8}> # 用 1byte 记录该层图块大小
<0b00|0b01|0b10> ... # 图块中存在多种数据状态,完整记录,并将数据填充到 1KB
<0b11-(0b110-0b{7})*-0b{2}> ... # 图块中数据状态一致,压缩存储,并将数据填充到 1KB
<0b111111...> ... # 图块开始出现连续 5 个 1 或任意位置出现连续 10 个以上的 1 说明是填充数据