实体组件系统中的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#作业系统非常简单,因为所有艰苦的工作都是为我们完成的(依赖项管理),所以您可以轻松、安全地编写快速代码:)
这就是我想在这个系列中与大家分享的全部内容。请关注以确保不会错过任何新内容。