Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Minecraft ha inspirado a muchos terceros a crear herramientas útiles para la visualización y la edición de archivos de mundos que existen fuera del cliente. Las herramientas como Universal Minecraft Editor y MCEdit son las favoritas de la comunidad y dependen de saber dónde encontrar los datos del nivel en el disco en los archivos LevelDB. Estos desarrolladores de terceros deben tener en cuenta que, con la actualización del almacenamiento de actores heredado al moderno en la versión1.18.3, cambiaron la ubicaciones donde se almacenan los datos de actores en los archivos LevelDB.
¿Qué aspecto tenían los datos de actores heredados?
Antes de la versión1.18.3, los datos de actores se almacenaban por fragmento como un blob de todos los actores en ese fragmento. Esto implicaba que, cada vez que un actor cambiaba, hacíamos lo siguiente:
- Recopilábamos los datos de cada actor individual en el fragmento.
- Adjuntábamos los datos de cada actor en un solo búfer/blob.
- Escribíamos esos datos agrupados en el fragmento.
¿Por qué estamos moviendo los datos de actores?
El formato del almacenamiento heredado de los datos de actores implicaba que tenías que guardarlos todos, incluso si solo cambiaba un actor en un fragmento. Esto causaba muchas operaciones innecesarias y hacía que el sistema de transferencia de entidades entre los fragmentos fuese frágil y costoso.
¿Cómo se almacenan los datos de actores modernos en el disco?
El almacenamiento de actores moderno guarda cada actor bajo una clave LevelDB individual y única. Esto nos permite guardar operaciones que ocurren solo en actores individuales. También significa que no hay ningún par clave-valor para todos los actores en un fragmento. De hecho, las claves de actores individuales están en sus propios espacios de clave, separadas del resto de los datos del fragmento, y los fragmentos no tienen datos en el disco que se puedan asociar directamente con los actores que contienen.
En cambio, usamos datos del fragmento para generar, de forma determinista, una clave que sea única del fragmento en el que almacenamos un resumen de las claves LevelDB para los actores que contiene. Estas entradas resumidas también están separadas de los datos del fragmento que no son de actores y del espacio de la clave del actor.
Veamos cómo aparecen en el disco:
Espacio de la clave del fragmento
En el lado izquierdo del diagrama, se muestra el espacio de la clave del fragmento. Estas claves toman el formato de la clave del fragmento heredada <Chunk Position><DimensionID>
. Dado que hay un formato de fragmentos heredados muy antiguo que no tiene un ID de dimensión, se puede cargar un mundo muy antiguo en el que las claves del fragmento no tengan un ID de dimensión. Se guardarán bajo una clave nueva con el ID de dimensión. Este es un comportamiento antiguo que todavía existe.
Estas son las claves más pequeñas que se usan agrupándolas de manera contigua en el disco. La clave del fragmento se usa como prefijo para las claves que almacenan todos los datos que no son de actores del fragmento. Cada tipo de dato del fragmento tiene su propio ID de clave que se adjunta al prefijo de la clave del fragmento.
ID de la clave del fragmento de datos que no son de actores
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
};
Espacio de la clave de resumen del actor
En el centro, está el espacio de la clave de resumen. Cada clave de resumen tiene el formato dg<Chunk Key>
.
dg
es un prefijo codificado de forma rígida para todas las claves de resumen. Esto hace que todos los resúmenes estén contiguos en el disco y aumenta el tamaño de todas las claves de resumen de modo que aparezcan delante de los datos del fragmento que no son de actores en el LevelDB.<Chunk Key>
es la misma cadena de claves que usa el fragmento con el que están asociados los datos.
Espacio de la clave del actor
En el lado derecho, se muestra el espacio de la clave del actor. Cada clave del actor tiene el formato actorpref<ActorUniqueID>
.
actorpref
es un prefijo codificado de forma rígida que se usa para todas las claves de actores. Esto hace que todos los datos de los actores estén contiguos en el disco y aumenta el tamaño de todas las claves de actores, de modo que aparezcan delante de los datos del fragmento que no son de actores y los resúmenes en el LevelDB.<ActorUniqueID>
es un ID único que se genera para cada actor cuando se agrega al nivel. Este ID es el mismo entre sesiones de juego y es único para este mundo. Es posible que otros actores en otros mundos tengan el mismo ID, pero no ocurrirá con ningún actor del mismo mundo.