次の方法で共有


Minecraft: Bedrock Edition のアクター ストレージ

Minecraft から着想を得て、多くのサード パーティーが世界ファイルの便利な表示および編集ツールを作成しています。これらのツールは、クライアントの外部に存在しています。 Universal Minecraft EditorMCEdit など、コミュニティーで人気が高いツールは、LevelDB ファイルに含まれるディスク上のレベルの各データがどこにあるかが判明していることを前提としています。 バージョン 1.18.3 で従来のアクター ストレージから最新のアクター ストレージにアップグレードすると、アクターのデータが格納される LevelDB ファイル内の場所が変更されるため、サード パーティーの開発者は注意する必要があります。

従来のアクター データの格納方法

バージョン 1.18.3 以前では、アクター データはチャンクごとに、そのチャンク内のすべてのアクターの BLOB として格納されていました。 つまり、1 つのアクターが変更されるたびに、次の処理が行われていました。

  • チャンク内の個々のアクターからデータを収集する
  • 各アクターのデータを 1 つのバッファー/BLOB に追加する
  • グループ化されたそのデータをチャンクに書き込む

アクター データを移動する理由

従来のアクター データのストレージ形式では、チャンク内の 1 つのアクターが変更されると、実際に変更されたのが 1 つであっても、すべてのデータを保存する必要がありました。 そのため、不要な処理が多く、チャンク間のエンティティの転送処理のコストが上がり、不安定なシステムになっていました。

ディスク上での最新のアクター データの格納方法

最新のアクター ストレージでは、各アクターを一意で個別の LevelDB キーのもとに格納するようになりました。 これにより、個々のアクターのみを対象とした保存処理が可能になります。 またこれは、チャンク内のすべてのアクターに対応するキーと値のペアがないことを意味します。 実際、個々のアクター キーは、他のチャンク データから独自のキー スペースに分離されます。チャンクは、チャンク内のアクターを直接参照するデータをディスク上に保有しません。

その代わりに、チャンクのデータを使用してチャンクに固有のキーを確定的に生成し、その中にチャンク内のアクターに対する LevelDB キーのダイジェストを格納します。 これらのダイジェスト エントリは、アクター以外のチャンク データとアクター キー スペースから分離されています。

これがディスク上でどのように整理されるか見てみましょう。

チャンク キー スペース、アクター ダイジェスト キー スペース、アクター キー スペースを示す LevelBD の図。

チャンク キー スペース

図の左側には、チャンク キー スペースがあります。 これらのキーは、<Chunk Position><DimensionID> というレガシー チャンク キーの形式をとります。 ディメンション ID が存在しない非常に古いレガシー チャンク形式もあります。そのため、チャンク キーにディメンション ID がない非常に古い世界を読み込むことも可能です。 これらのチャンク キーは、ディメンション ID を持つ新しいキーのもとに保存されます。 これは今も使用されている古い動作です。

これらは、ディスク上で連続してつなげて使用される最小のキーです。 チャンク キーは、チャンクのアクター以外のすべてのデータを格納するキーのプレフィックスとして使用されます。 チャンクの各タイプのデータは独自のキー ID を持っており、このキー ID がチャンク キー プレフィックスの後に追加されます。

アクター以外のデータのチャンク キー ID


enum class LevelChunkTag : char {
  Data3D = 43,
  Version, // This was moved to the front as needed for the extended heights feature. Old chunks will not have this data.
  Data2D,
  Data2DLegacy,
  SubChunkPrefix,
  LegacyTerrain,
  BlockEntity,
  Entity, // Legacy actor storage which will be deleted from LevelDB upon upgrading the chunk to use modern actor storage
  PendingTicks,
  LegacyBlockExtraData,
  BiomeState,
  FinalizedState,
  ConversionData, // Data that the converter provides that are used at runtime for things like blending
  BorderBlocks,
  HardcodedSpawners,
  RandomTicks,
  CheckSums,
  GenerationSeed,
  GeneratedPreCavesAndCliffsBlending,
  BlendingBiomeHeight,
  LegacyVersion = 118
};

アクター ダイジェスト キー スペース

中央にはダイジェスト キー スペースがあります。 各ダイジェスト キーは、dg<Chunk Key> という形式をとります。

  • dg は、すべてのダイジェスト キーに使用されるハードコードされたプレフィックスです。 これにより、すべてのダイジェストがディスク上で連続してつながって、すべてのダイジェスト キーのサイズが大きくなり、LevelDB のアクター以外のチャンク データの前に配置されます。

  • <Chunk Key> は、データが関連付けられているチャンクで使用されているキー文字列と同じです。

アクター キー スペース

右側にはアクター キー スペースがあります。 各アクター キーは actorpref<ActorUniqueID> という形式をとります。

  • actorpref は、すべてのアクター キーに使用されるハードコードされたプレフィックスです。 これにより、すべてのアクターデータがディスク上で連続してつながって、すべてのアクター キーのサイズが大きくなり、LevelDB のアクター以外のチャンク データとすべてのダイジェストの前に配置されます。

  • <ActorUniqueID> は、アクターがレベルに追加されたときに各アクターに生成される一意の ID です。 この ID はプレイ セッション間で共通したものであり、この世界でのみ一意です。 他の世界のアクターが同じ ID を持つことはありますが、同じ世界のアクターが同じ ID を持つことはありません。