Bootstrap

Unity3D DOTS系列之BlobAsset核心机制详解

前言

BlobAsset是Unity3D DOTS(Data-Oriented Technology Stack)系列中的一个关键概念,它主要用于管理和处理游戏中的大型数据块(blob)。BlobAsset是一种能够在内存中高效存储和传输的数据结构,特别适合存储不可变的、只读的、大量的数据,如模型、纹理、音频等。其核心思想是将这些数据块存储在连续的内存块中,以提高数据访问和传输的效率。

对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀!

主要特点

  1. 不可变性:BlobAsset一旦创建,其数据就不能被更改。如果需要修改数据,必须创建一个新的BlobAsset。
  2. 内存连续:BlobAsset将数据存储在连续的内存块中,这有助于提升数据访问和传输的效率。
  3. 只读性:BlobAsset主要用于存储只读数据,适合那些在整个游戏过程中不需要改变的数据。
  4. 共享性:BlobAsset可以被多个实体(Entity)共享,从而避免数据的重复存储,节省内存。
  5. 高性能:BlobAsset支持Burst编译器编译,序列化/反序列化性能优异,适合处理大量数据。

支持的数据类型

BlobAsset主要支持非托管类型的数据,如int、float、double等。此外,它还支持三种特殊的类型:BlobArray、BlobPtr、BlobString,用于处理数组、指针和字符串等特殊需求。

核心技术原理

BlobAsset机制的实现依赖于Unity3D的ECS(Entity Component System)框架和低级内存管理系统。BlobAsset可以被视为一种特殊的组件,存储在内存中的BlobAssetStore中,并通过BlobAssetReference来访问和传输。BlobAssetReference是一种轻量级的引用类型,包含了数据在内存中的偏移量和大小等信息,可以方便地在内存中进行数据访问和传输。

交互方式

创建和使用BlobAsset的步骤如下:

  1. 创建BlobBuilder:BlobBuilder是一个用于创建BlobAsset的工具类,它会计算和设置数据的相对偏移量。
  2. 添加数据:使用BlobBuilder的Root属性或Allocate方法来添加数据。
  3. 生成BlobAssetReference:通过BlobBuilder的CreateBlobAssetReference方法生成BlobAssetReference,用于访问BlobAsset的数据。
  4. 释放资源:不再需要BlobBuilder时,需要手动释放其占用的内存。

代码实现

以下是一个简单的示例代码,演示了如何使用BlobAsset机制来管理和处理游戏中的大型数据块。

using Unity.Entities;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
// 定义一个BlobAsset的数据结构
struct MyBlobAsset
{
public int data1;
public float data2;
public bool data3;
}
// 定义一个BlobAssetComponent,用于存储BlobAsset的引用
struct BlobAssetComponent : IComponentData
{
public BlobAssetReference<MyBlobAsset> blobAssetRef;
}
// 定义一个System,用于处理BlobAsset
class MySystem : SystemBase
{
protected override void OnUpdate()
{
Entities.ForEach((ref BlobAssetComponent blobAssetComponent) =>
{
// 通过BlobAssetReference来访问BlobAsset的数据
var blobAsset = blobAssetComponent.blobAssetRef.Value;
Debug.Log("Data1: " + blobAsset.data1);
Debug.Log("Data2: " + blobAsset.data2);
Debug.Log("Data3: " + blobAsset.data3);
}).Schedule();
}
}
// 在游戏初始化时创建BlobAsset
public class GameManager : MonoBehaviour
{
private EntityManager entityManager;
void Start()
{
entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
// 创建一个BlobAsset
var blobAsset = new MyBlobAsset
{
data1 = 100,
data2 = 3.14f,
data3 = true
};
// 将BlobAsset存储到BlobAssetStore中,并获取引用
var blobAssetRef = entityManager.GetBlobAssetReference(blobAsset, Allocator.Persistent);
// 创建一个实体,并添加BlobAssetComponent
var entity = entityManager.CreateEntity();
entityManager.AddComponentData(entity, new BlobAssetComponent { blobAssetRef = blobAssetRef });
}
}

在这个示例中,我们首先定义了一个名为MyBlobAsset的数据结构,然后定义了一个名为BlobAssetComponent的组件来存储BlobAsset的引用。接着,我们定义了一个名为MySystem的System来处理BlobAsset。在GameManagerStart方法中,我们创建了一个BlobAsset,将其存储到BlobAssetStore中,并在一个实体上添加了BlobAssetComponent。

BlobAsset机制是Unity3D DOTS中的一个重要概念,通过其高效的内存管理和数据访问方式,可以显著提升游戏的性能和效率。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

;