地图区域四叉树导出结构

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 文件内容:

  1. 第一段、记录数据偏移: 前 32byte,每 2byte 为一个数据单位,表示一个数字,第几个该数据单位就表示第几层, 例如第 14 个数据单位其 2byte 的二进制为:0b0101010101011011, 则表示序号 14 层的数据开始于该二进制文件中偏移量为 21851KB 处。 因为当前有 14 层,所以该数据单位重复 14 次,以表示从序号 1 到序号 14 的各层数据。 注意,这一段记录数据偏移的二进制位本身不算入偏移量。

  2. 第二段、记录各层数据: 若该层没有数据,则直接跳过,不占据任何二进制位。

    否则根据该层大小和数据密度划定一个瓦片图块尺寸,尺寸为 2 的 N 次方,N 小于等于 15,用 1byte 的二进制位记录下 N。 例如某层瓦片图块尺寸划定为 16x16,16 为 2 的 4 次方,则该层数据图块标识记录为:0b00000100。

    定义每个单元格可能有三种状态:

    1. 0b00 代表默认、未知,即需要进一步查更深一层的格子。
    2. 0b01 代表该格完全位于区域内,无需进一步查深层。
    3. 0b10 代表该格子完全位于区域外,无需进一步查深层。

    接下来按先 x 后 y 的顺序遍历瓦片图块,每个图块内的数据按以下规则继续处理:

    1. 若该图块中存在多种数据状态,则按先 x(横向)后 y(纵向)的顺序,完整记录各单元格状态,状态占两个 bit,即前面定义的 0b00, 0b01, 0b10。
    2. 若该图块中数据状态一致,则先存入一个标识符 0b11,然后若该图块后还有状态一致的图块,则再存入一个标识符 0b110 并接着存入 7bit 代表之后连续的图块数(不计当前图块),若图块数超过 127 可重复该步骤直到后续没有连续状态的图块了,最后存入两位二进制代表状态。
    3. 最后,每层数据需要对齐到 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 说明是填充数据