BlobAsset
概述:
- Blob Asset是一种特殊的数据结构,用于存储不可变的、只读的、大量的数据。Blob是Binary Large Object的缩写,意为二进制大对象。
- Blob Asset的主要特点是它们是不可变的,并且可以在内存中任意移动,这使得它们非常适合用于存储大量的只读数据,例如网格数据、动画数据、声音数据等。
- Blob Asset的另一个重要特性是它们可以被多个实体共享。例如,如果你有一个网格数据,你可以将这个数据存储在一个Blob Asset中,然后让所有需要这个网格的实体都引用这个Blob Asset。这样可以避免数据的重复存储,节省内存。
特性说明:
- BlobAsset是一个不可以被改变的二进制数据;
- 这意味着并发处理的时候使用它们访问它们是安全的;
- 它里面的数据类型是被限制为非托管类型,所以兼容burst compiler。
- 因为是非托管类型,所以BlobAsest 序列化/反序列性能要比其他格式的数据快得多;
- Blob Assets可以被entity里面的组件ComponentData引用;
支持的类型
- BlobAsset不能存放托管类型的数据: string , array等其它的托管的物体对象;
- BlobAsset只能存放值类型的数据,如: int ,float, double,
- BlobAsset不能使用内部指针;
- 除了值类型以外BlobAsset支持其它的三种特殊的类型: BlobArray,BlobPtr, BlobString
使用的交互方式
- 必须使用BlobBuilder类型才能创建一个BlobAsset 创建一个BlobBuilder对象,因为BlobBuilder会计算相对偏移量;===>把数据build —> blobAsset—>BlobBuilder来处理
- 你必须使用ref关键字或BlobAssetReference,通过引用访问和传递blob asset。这确保了blob asset内的任何相对偏移仍然解析到正确的绝对地址。这是因为blob asset中的数据必须是可重定位的。Blob asset可以作为一个整体在内存中重新定位,但是通过值而不是通过引用访问它们并不能保证整个blob资产被复制。
BlobAsset 使用分析
创建与使用一个BlobAsset步骤:
创建和使用一个BlobAsset的步骤如下:
- 创建一个BlobBuilder实例。BlobBuilder是一个用于创建BlobAsset的工具类,它会帮助你计算和设置数据的相对偏移量。
Allocator allocator = Allocator.Temp;
BlobBuilder blobBuilder = new BlobBuilder(allocator);
- 使用BlobBuilder的Root属性来获取一个BlobBuilder的引用,然后使用这个引用来添加数据。
ref MyBlobAssetData blobAssetData = ref blobBuilder.ConstructRoot<MyBlobAssetData>();
blobAssetData.MyInt = 123;
blobAssetData.MyFloat = 456.789f;
- 如果你需要添加一个数组,你可以使用BlobBuilder的Allocate方法来分配内存,并返回一个BlobArray的引用,然后你可以使用这个引用来添加数据。
BlobBuilderArray<float> blobArray = blobBuilder.Allocate(ref blobAssetData.MyArray, 10);
for (int i = 0; i < blobArray.Length; i++)
{
blobArray[i] = i;
}
- 使用BlobBuilder的CreateBlobAssetReference方法来创建一个BlobAssetReference,这个方法会返回一个BlobAssetReference,你可以使用这个BlobAssetReference来访问BlobAsset的数据。
BlobAssetReference<MyBlobAssetData> blobAssetReference = blobBuilder.CreateBlobAssetReference<MyBlobAssetData>(allocator);
- 最后,不要忘记释放BlobBuilder,因为BlobBuilder是使用Allocator创建的,所以在不再需要它的时候,你需要手动释放它。
blobBuilder.Dispose();
- 使用BlobAssetReference的Value属性来访问BlobAsset的数据。
Debug.Log(blobAssetReference.Value.MyInt);
Debug.Log(blobAssetReference.Va