다음을 통해 공유


Minecraft - Bedrock Edition의 액터 스토리지

Minecraft는 클라이언트 외부에 존재하는 유용한 월드 파일 보기 및 편집 도구를 생성할 수 있도록 수많은 타사에 영감을 주었습니다. Universal Minecraft EditorMCEdit 등은 커뮤니티에서 즐겨 사용되며 LevelDB 파일의 디스크에서 레벨 데이터의 각 조각을 찾을 위치를 알고 있느냐에 의존하는 도구입니다. 버전 1.18.3에서 레거시 액터 스토리지에서 최신 액터 스토리지로 업그레이드하면서 액터에 대한 데이터가 저장되는 LevelDB 파일의 위치가 변경되었으며 이에 해당하는 타사 개발자는 인식하고 있어야 합니다.

레거시 액터 데이터는 어떤 모습인가요?

버전 1.18.3 이전에는 액터 데이터가 해당 청크에 있는 모든 액터의 blob으로 청크당 저장되었습니다. 즉, 단일 액터가 변경될 때마다

  • 청크의 모든 개별 액터에서 데이터를 수집합니다.
  • 각 액터에 대한 데이터를 단일 버퍼/blob에 추가합니다.
  • 해당 그룹화된 데이터를 청크에 기록합니다.

액터 데이터를 이동하는 이유는 무엇인가요?

레거시 액터 데이터 스토리지 형식에서는 한 액터가 청크에서 변경되면 실제로 하나만 변경되더라도 모두 저장해야 했습니다. 이로 인해 불필요한 작업이 많이 발생했고 청크 간의 개체 전송을 처리하는 데 비용이 많이 들고 취약한 시스템이 되었습니다.

최신 액터 데이터는 디스크에 어떻게 저장되나요?

최신 액터 스토리지는 고유한 개별 LevelDB 키 아래에 저장되도록 각 액터를 이동합니다. 이를 통해 개별 액터에서만 작동하는 저장 작업을 수행할 수 있습니다. 또한 청크의 모든 액터에 대한 키-값 쌍이 없다는 의미합니다. 실제로 개별 액터 키는 나머지 청크 데이터와 자체 키 공간으로 분리되며 청크에는 포함된 액터를 직접 참조하는 데이터가 디스크에 없습니다.

대신 청크의 데이터를 사용하여 청크에 있는 액터의 LevelDB 키 다이제스트를 저장하는 청크 고유의 키를 결정론적으로 생성합니다. 이러한 다이제스트 엔트리는 액터가 아닌 청크 데이터 및 액터 키 공간에서도 분리됩니다.

디스크에 어떻게 나타나는지 살펴보겠습니다.

청크 키 공간, 액터 다이제스트 키 공간 및 액터 키 공간을 보여주는 LevelBD 다이어그램

청크 키 공간

다이어그램 왼쪽에 청크 키 공간이 있습니다. 이러한 키는 <Chunk Position><DimensionID>의 레거시 청크 키 형식을 사용합니다. 차원 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를 갖지 않습니다.