当前位置: 首页 > article >正文

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


http://www.kler.cn/a/288360.html

相关文章:

  • k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
  • 前端系统设计面试题(二)Javascript\Vue
  • leetcode-位运算题型
  • C++中的std::tuple和std::pair
  • 亲测有效:Maven3.8.1使用Tomcat8插件启动项目
  • 在JPA和EJB中用乐观锁解决并发问题
  • UFUG2601-OJ palindrome
  • idea便捷操作
  • Kubernetes 1.20 上将容器从 Docker Engine 改为 Containerd
  • Idea发布springboot项目无法识别到webapp下面的静态资源
  • <数据集>无人机识别数据集<目标检测>
  • 等保2.0通用部分 | 安全物理环境(三级)测评指导书
  • ai数字人音频停顿处理,删除无用音频段
  • 【C++拓展(一)】后端开发常用的技术栈
  • 在随机点实现凸包包围游戏地区
  • 产品概述Tektronix泰克TCP0030A电流探头TCP0030原装二手
  • 前端bug:v-show嵌套组件外层,页面扩大后,组件被遮挡
  • 使用支持UDP协议的IP是否更加快速?
  • 使用Python+docx+openpyxl将Word表格转换为Excel表格
  • EI论文被引多少次算高引?
  • div嵌套img,去除img下的小空隙
  • <Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?
  • 笔记:《利用Python进行数据分析》之透视表和交叉表
  • 了解Python中如何实现多线程,并讨论GIL的影响
  • 机器学习:opencv--图像边缘检测
  • 机器学习——集成学习