Infdev在开发过程中引入了新的数据存储挑战:由于其地图的大小(地球表面积的几倍),infdev中生成的地形有可能在内存中占大约为235PB,即240,640TB。 因此,为了减少文件大小和内存使用,Notch决定将地形分成16×128×16块,并在不可见时将它们存储在磁盘上。此外,地形仅在玩家视角的渲染距离内生成,大大减少了保存大小,因为大多数玩家只能在合理的时间范围内搜索地图的一小部分。Alpha使用了这种技术,而因为其成功,Beta和Java版1.0.0仍然使用这一般概念。
世界文件夹结构[]
Alpha世界实际上是一个包含至少一个名为level.dat的文件的文件夹。还有一个session.lock文件,以确保一次只有一个Minecraft打开该世界。
世界文件夹最多可包含64个子文件夹,每个子文件夹最多包含64个子文件夹。这些文件夹包含保存世界的地形和实体的区块文件。 每个区块文件由其区块位置xPos和zPos标识。区块文件名称的不同部分是通过获取xPos和zPos的base36表示来获得的。放置区块文件的文件夹的名称可以通过获取xPos和zPos,模除64(或按63进行位AND运算)和转换为base36来找到。负坐标必须通过补码按位解释为正数。因此,-13被视为243(如果它的大小为一个字节)。
例如,要查找位置为(-13,44)处的区块:
- 第一个文件夹名为
base36(-13 % 64)
,也就是,即"1f"。 - 第二个文件夹名为
base36(44 % 64)
。也就是base36(44)
,即"18"。 - 区块文件名为
"c." + base36(-13) + "." + base36(44) + ".dat"
。计算得"c.-d.18.dat"。 - 所以位于(-13,44)的区块文件存储在"1f/18/c.-d.18.dat"。
每个区块都会独立于文件和文件夹名称记住其位置。请参阅下文,了解如何从文件数据中读取区块的位置。
维度[]
其他维度的保存方式与普通世界相同,但不是将世界文件混合在保存文件夹中,而是将文件存储在具有自己的区域和方块数据的其他子文件夹中。它们的名称以DIM
开头,后跟维度ID。
在Alpha中使用这些维度ID:
ID | 文件夹 | 维度 |
---|---|---|
0 | saves/[世界]/ |
正常世界(主世界),总是存储在不带DIM 的世界文件夹中
|
-1 | saves/[世界]/DIM-1/ |
下界,在万圣节更新中加入 |
session.lock格式[]
此文件包含了该世界最后一次进入时的时间戳。文件为一64字节以大端字节序格式的整值数据,为自1970年(标准时区)开始的以百为单位的毫秒数。
与典型的lock文件不同,这一文件确保了最后访问这一世界的程序有读取和修改的权限。该过程通常如下所示:
- 程序打开session.lock
- 程序在session.lock写入当前时间戳
- 程序对session.lock的变化进行监控
- 如果session.lock内容发生变化,则程序中断并锁定世界。
level.dat Format[]
level.dat文件是一个GZip压缩的NBT文件,用于存储全局级别数据(时间、玩家生命、背包、速度和地图中的位置等)。最重要的是,它存储了地形生成器用于在运行中无缝生成更多地形的随机种子。
这个文件有这个结构:
- 根标签。
- Data: 全局世界数据。
- LastPlayed: 当玩家保存游戏时,存储Unix时间戳(以毫秒为单位)。
- SizeOnDisk: 估计整个世界的大小(以字节为单位)。
- RandomSeed: 为地形提供随机种子的随机数。
- SpawnX: 世界的生成位置的X坐标。
- SpawnY: 世界的生成位置的Y坐标。
- SpawnZ: 世界的生成位置的Z坐标。
- Time: 以刻为单位存储当前“一天中的时间”。每个实际秒数有20刻,每个Minecraft昼夜更替有24000刻,使整个周期长度为20分钟。0是白天的开始,12000是日落的开始,13800是夜晚的开始,22200是日出的开始,24000又是白天的开始。 存储在level.dat中的值总是在增加,并且可以大于24000,但“时间”总是模除“时间”字段值的24000。
- Player: 世界的的单人游戏玩家。
- Dimension: 玩家所在的维度。0是主世界,1是下界。
- Pos: 3个TAG_Doubles的列表,用于玩家的X,Y和Z位置。
- Rotation: 2个TAG_Floats的列表,用于玩家视角的偏航(Yaw)和俯仰(Pitch)。
- Motion: 3个TAG_Doubles的列表,用于X,Y和Z运动,以米每刻为单位。
- OnGround: 1或0(true/false) — 如果玩家在地上为true。
- FallDistance: 玩家掉落了多远。
- Health: 玩家拥有的生命值。20为10颗心。
- AttackTime: 玩家免受攻击的刻数。
- HurtTime: 玩家被攻击后红色的刻数。
- DeathTime: 玩家死亡的刻数 — 用于控制死亡动画。
- Air: 玩家开始溺水之前的刻数。从300开始。
- Fire: 当为负数时,玩家将被点燃之前的刻数。当为正数时,火扑灭前的刻数。
- Score: 玩家的得分。该分数从未在Alpha或甚至beta中使用,因此该值无关紧要。
- Inventory: TAG_Compounds的列表,表示玩家背包中的物品。
- 背包物品
- Slot: 物品所在的槽。
- id: 物品ID。
- Damage: 物品的数据值,或工具的损伤值。
- Count: 栈中此物品的编号。范围从-128到127。小于2的值不会在游戏中显示。
- 背包物品
- Data: 全局世界数据。
区块格式[]
区块文件,如上所示,是GZip压缩的NBT文件。他们有这个结构:
- 根标签。
- Level: 该区块的世界数据。
- xPos: X区块坐标。
- zPos: Z区块坐标。
- TerrainPopulated: 1 or 0 (true/false) — 若Minecraft在这个区块中产生了特殊的功能,例如树木、花朵、矿石、地牢,则为true。
- LastUpdate: 区块最后加载时的刻。
- Blocks: 方块ID为32768字节,每个方块8位。
- Data: 方块数据为16384字节,每个方块4位。
- BlockLight: 方块光照为16384字节,每个方块4位。
- SkyLight: 天空光照为16384字节,每个方块4位。
- HeightMap: 高度地图信息为256字节,每个XZ列4位。用于加快天空光照计算。
- Entities: List of TAG_Compounds, 每一个用于区块中的每个实体。
- 一个实体。
- 见区块格式 → 实体格式 — 并非所有信息都适用于Minecraft Alpha。
- 一个实体。
- TileEntities: List of TAG_Compounds, 每一个用于区块中的每个实体。
- A tile entity.
- 见区块格式 → 附加实体格式 — 并非所有信息都适用于Minecraft Alpha。
- A tile entity.
- Level: 该区块的世界数据。
参见[]
版本 | |||||||
---|---|---|---|---|---|---|---|
开发周期 |
| ||||||
技术 |
| ||||||
多人游戏 | |||||||
游戏订制 |
语言