Unity DOTS

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()为异步单线

           程执行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海海不瞌睡(捏捏王子)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值