Análisis del mecanismo central de BlobAsset en el último tutorial de Unity DOTS

Recientemente, DOTS lanzó una versión oficial. Compartamos el mecanismo BlobAsset en DOTS para facilitar que todos aprendan y dominen el desarrollo de Unity DOTS.

 Descripción general de BlobAsset

DOTS proporciona un mecanismo BlobAsset para generar datos binarios eficientes a partir de datos. Los datos de BlobAsset son inmutables. BlobAsset solo admite datos de tipo no administrado. Admite tipos compilados por el compilador Burst. Al mismo tiempo, solo almacena datos no administrados, lo que hace que el rendimiento y la eficiencia de serialización y deserialización sean muy lentos. BlobAsset también puede ser utilizado por componentes de entidades.

¡bien! Aquí hay un grupo de intercambio de desarrollo de juegos , que reúne a un grupo de principiantes a quienes les encanta aprender juegos, así como a algunos expertos técnicos que participan en el desarrollo de juegos. Le invitamos a venir, intercambiar y aprender.

BlobAsset no admite otros objetos administrados, como matrices, cadenas, etc. (el recolector de basura puede reciclar objetos administrados) y no se permite cambiar el contenido de los datos internos durante el tiempo de ejecución. Para cargar más rápido, BlobAsset solo contendrá tipos de valor pasado y no puede contener referencias internas ni punteros internos. Además de admitir tipos de valores estándar (float, int, etc.), BlobAsset también admite tres tipos especiales: BlobArray, BlobPtr y BlobString. Si BlobAsest contiene punteros internos, el compilador informará un error. Al utilizar BlobAsset, preste atención a los siguientes aspectos:

R: Para crear un BlobAsset, primero debe generar un BlobBuilder para ayudarlo a calcular el desplazamiento de cada dato en la memoria;

Resumen: use BlobBuilder para generar BlobAsset y use BlobAssetReference para acceder de manera eficiente a los datos internos.

Creación y uso de BlobAsset

Cree un BlobAsset y siga los siguientes pasos para procesarlo:

BlobBuilder construye un BlobAsset, almacena los datos en él y luego genera un BlobAssetReference<T> para manipular los datos para el usuario. El código de referencia es el siguiente:

 struct MarketData
 {
 public float PriceOranges;
 public float PriceApples;
 }
 BlobAssetReference<MarketData> CreateMarketData()
 {
 // Create a new builder that will use temporary memory to construct the blob asset
 var builder = new BlobBuilder(Allocator.Temp);
 // Construct the root object for the blob asset. Notice the use of `ref`.
 ref MarketData marketData = ref builder.ConstructRoot<MarketData>();
 // Now fill the constructed root with the data:
 // Apples compare to Oranges in the universally accepted ratio of 2 : 1 .
 marketData.PriceApples = 2f;
 marketData.PriceOranges = 4f;
 // Now copy the data from the builder into its final place, which will
 // use the persistent allocator
 var result = builder.CreateBlobAssetReference<MarketData>(Allocator.Persistent);
 // Make sure to dispose the builder itself so all internal memory is disposed.
 builder.Dispose();
 return result;
 }
 #endregion

Si desea guardar una matriz en un BlobAsset, puede usar BlobArray para manejarlo. Cada elemento se coloca según el desplazamiento del índice dentro de los datos de la matriz. El código para almacenar la matriz en BlobAsset es el siguiente:

 #region CreateBlobAssetWithArray
 struct Hobby
 {
 public float Excitement;
 public int NumOrangesRequired;
 }
 struct HobbyPool
 {
 public BlobArray<Hobby> Hobbies;
 }
 BlobAssetReference<HobbyPool> CreateHobbyPool()
 {
 var builder = new BlobBuilder(Allocator.Temp);
 ref HobbyPool hobbyPool = ref builder.ConstructRoot<HobbyPool>();
 // Allocate enough room for two hobbies in the pool. Use the returned BlobBuilderArray
 // to fill in the data.
 const int numHobbies = 2;
 BlobBuilderArray<Hobby> arrayBuilder = builder.Allocate(
 ref hobbyPool.Hobbies,
 numHobbies
 );
 // Initialize the hobbies.
 // An exciting hobby that consumes a lot of oranges.
 arrayBuilder[0] = new Hobby
 {
 Excitement = 1,
 NumOrangesRequired = 7
 };
 // A less exciting hobby that conserves oranges.
 arrayBuilder[1] = new Hobby
 {
 Excitement = 0.2f,
 NumOrangesRequired = 2
 };
 var result = builder.CreateBlobAssetReference<HobbyPool>(Allocator.Persistent);
 builder.Dispose();
 return result;
 }
 #endregion

Para almacenar una cadena en BlobAsset, el código es el siguiente:

#region CreateBlobAssetWithString
 struct CharacterSetup
 {
 public float Loveliness;
 public BlobString Name;
 }
 BlobAssetReference<CharacterSetup> CreateCharacterSetup(string name)
 {
 var builder = new BlobBuilder(Allocator.Temp);
 ref CharacterSetup character = ref builder.ConstructRoot<CharacterSetup>();
 character.Loveliness = 9001; // it's just a very lovely character
 // Create a new BlobString and set it to the given name.
 builder.AllocateString(ref character.Name, name);
 var result = builder.CreateBlobAssetReference<CharacterSetup>(Allocator.Persistent);
 builder.Dispose();
 return result;
 }
 #endregion

Almacene los datos de BlobPtr en BlobAsset, el código es el siguiente:

#region CreateBlobAssetWithInternalPointer
 struct FriendList
 {
 public BlobPtr<BlobString> BestFriend;
 public BlobArray<BlobString> Friends;
 }
 BlobAssetReference<FriendList> CreateFriendList()
 {
 var builder = new BlobBuilder(Allocator.Temp);
 ref FriendList friendList = ref builder.ConstructRoot<FriendList>();
 const int numFriends = 3;
 var arrayBuilder = builder.Allocate(ref friendList.Friends, numFriends);
 builder.AllocateString(ref arrayBuilder[0], "Alice");
 builder.AllocateString(ref arrayBuilder[1], "Bob");
 builder.AllocateString(ref arrayBuilder[2], "Joachim");
 // Set the best friend pointer to point to the second array element.
 builder.SetPointer(ref friendList.BestFriend, ref arrayBuilder[2]);
 var result = builder.CreateBlobAssetReference<FriendList>(Allocator.Persistent);
 builder.Dispose();
 return result;
 }
 #endregion

El BlobPtr aquí se almacena en función del desplazamiento de los datos;

El mecanismo BlobAsset de hoy se comparte con usted aquí. Para obtener más series DOTS, síganos y continúe actualizándose.

Supongo que te gusta

Origin blog.csdn.net/voidinit/article/details/134038666
Recomendado
Clasificación