1.基本概念
DOTS是Unity基于ECS架构开发的一套包括:Burst Complier技术和Job System技术面向数据的技术栈。
2.Burst Complier
- 优势:Burst 是一种编辑器,可将IL./.NET字节转化为高度优化的本地代码,提供C#原生代码性能,还暴露了CPU的内在特性,从而对性能关键代码进行微调。
- 使用方式:使用[BurstCompile]装饰Job结构。
3.JobSystem
- 优势:由于Unity是单线程,所有逻辑运行在主线程,因此需要Job System将计算任务拆分成多个并行任务执行。
- 使用方式:定义Job结构体 > 调度Job > 等待完成
[BurstCompile] struct MathfJob : IJobParallelFor { [ReadOnly] public NativeArray<float> inputData; public NativeArray<float> outputData; public void Execute(int index) { outputData[index] = inputData[index] * inputData[index]; } } private NativeArray<float> inputData; private NativeArray<float> outputData; private JobHandle jobHandle; void Start() { //Allocator.Persistent表示内存会持续到手动释放 inputData = new NativeArray<float>(1_000_000, Allocator.Persistent); outputData = new NativeArray<float>(1_000_000, Allocator.Persistent); } void Update() { if (!jobHandle.IsCompleted) jobHandle.Complete(); var job = new MathfJob { inputData = inputData, outputData = outputData }; jobHandle = job.Schedule(inputData.Length, 64); } void LateUpdate() { jobHandle.Complete(); } void OnDestroy() { jobHandle.Complete(); inputData.Dispose(); outputData.Dispose(); }
注意事项:
1.使用NativeArray<T>数组代替普通数组,不受GC影响,可以跨线程访问。
2.核心接口:
| IJob | 一次性计算 |
| IJobParallelFor | 批量数据处理 |
| IJobFor | 复杂并行迭代任务 |
| IJobParallelForTransform | 批量并行处理Transfrom组件 |
3.通过Schedule(总长度,每批次处理数量)将Job交给线程池;通过Complete()等待Job执
行完,会阻塞主线程(逻辑不会继续执行)。
4.Job完成的前提下,必须在OnDestroy中使用Dispose()手动销毁NativeArray。
4.ECS架构
1.Entity(实体)
[SerializeField]private Mesh mesh;
[SerializeField]private Material material;
private void Start()
{
// 获取实体管理器
EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
// 创建实体原型(包含所有必要组件)
Entity Archetype = entityManager.CreateEntity(
typeof(Translation),
typeof(RenderMesh),
typeof(RenderBounds)
);
Entity entity = entityManager.CreateEntity(Archetype);
entityManager.SetSharedComponentData(entity,new RenderMesh{
mesh = mesh,
material = material,
layerMask = 1;
});
}
2.Component(组件)
struct PlayerData : IComponentData{
public float speed;
}
3.System(系统)
partial class MovementSyetem : SystemBase{
protected override void OnUpdate(){
float deltaTime = Time.DeltaTime;
Entities.ForEach((ref Translation position, in PlayerData data) => {
position.Value.x += deltaTime * Data.speed;
}).ScheduleParallel();
}
}
注:1. ForEach是处理实体的方式,定义对符合条件(配合查询使用)的实体执行的逻辑。
2. ref为读写访问;in为只读访问。
3. .Run()为主线程执行;.ScheduleParallel()为异步并行多线程执行;.Schedule()为异步单线
程执行。
1457

被折叠的 条评论
为什么被折叠?



