第4部分:Unity ECS-ECS和Jobs

63 篇文章 11 订阅

实体组件系统中的Jobs

  我将从ECS谈论jobs的用法,如果你不熟悉jobs本身,可以看看Joachim的演示文稿或官方文档。简而言之,C# job system允许我们以安全、简单的方式编写更高效的多线程代码。与ECS方法不同,您需要管理对job的依赖性。有了JobComponentSystem,它会自动为您完成。

JobComponentSystem-它是什么?

  JobComponentSystem与ComponentSystem非常相似。它派生自ComponentSystem,因此您还可以使用OnStartRunning、OnStopRunning、OnDestroyManager、OnCreateManager或OnUpdate等函数-但这有点不同。让我们来看看它是如何制作的:

public class DamageSystem : JobComponentSystem
{
    public struct Data
    {
        public int Length;
        public ComponentDataArray<Health> Health;
    }
    [Inject] private Data m_data;
    
    private struct Job : IJob
    {
        public Data data;
        public void Execute()
        {
            for (int i = 0; i < data.Length; i++)
            {
                var health = data.Health[i];
                health.Value--;
                data.Health[i] = health;
            }
        }
    }
    
    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        Job job = new Job() {
            data = m_data
        };
        return job.Schedule(inputDeps);
    }
}

但这可以简化为:

  因为IJobProcessComponentData并行工作,所以代码少得多,实际上效率更高,而IJob并非如此。还有更多像IJobParallelForBatch、IJobParallelForFilter和IJobParallelFor这样的作业。最后提到的也是并行工作的,它更类似于IJob。用法示例:

  作业不能在主线程中工作,所以您需要将所有数据从主线程传递到作业-使用OnUpdate函数,如您在上面的示例中所见。

Burst Compiler

  使用作业结构上方的属性BurstCompile,我们可以使用Burst编译器来获得更好的性能。请记住,在编辑器中,它将比在构建版本中慢,因为Unity在安全检查方面做了很好的工作,以防止任何意外的行为和错误,但这自然是有代价的。但是,您可以在那里的编辑器中禁用它:

在这里插入图片描述
  但是,除非您衡量绩效,否则不要这么做。这个真的可以帮助你理解什么是你不应该做的,为什么不应该做。

  为了编写更优化的代码,我们应该使用Unity数学包,这是一个带有着色器语法的数学库。我们有很多新的类型,比如,浮动2,浮动3,整数2,整数3,布尔2,布尔3等等,还有数学函数,比如Mathf。

EntityCommandBuffer-如何让他们找到工作

  在作业中使用EntityCommandBuffer略有不同,因为它不是自动创建的。我们需要创建BarrierSystem并在主线程(OnUpdate)中创建EntityCommandBuffer,然后将其传递给Job。BarrierSystem只是一个公共类YourBarrier:BarrierSystem{},正如您可以从我以前的文章中读到的,您知道只需使用[Inject]YourBarrier Barrier Barrier就可以注入其他系统;最后,将其传递给作业。

  在新预览版(0.0.8)中,您可以在并行作业中使用并发缓冲区,只需确保使用EntityCommandBuffer.Concurrent即可

一些有用的信息

  请记住,BarrierSystem是更新的系统,命令将在您的BarrierSystem更新后执行。请记住,您仍然可以使用[UpdateAfter/Beer(…)]管理更新顺序。属性。

  在OnUpdate()函数中调度作业之前,您仍然可以向作业添加额外的依赖项。

  像ComponentSystem一样,JobComponentSystem也跟踪所需的实体,因此在不需要时不会调用它。即使在ComponentSystem中也可以使用作业,不需要使用JobComponentSystem,但最好在其中使用它,因为它在依赖项管理方面有很多工作要做。

  在ECS中使用C#作业系统非常简单,因为所有艰苦的工作都是为我们完成的(依赖项管理),所以您可以轻松、安全地编写快速代码:)

  这就是我想在这个系列中与大家分享的全部内容。请关注以确保不会错过任何新内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值