Unity ECS学习笔记(2)JobComponentSystem和ForEach

最近在学习unity的ecs框架,转载几篇写的比较好的文章帮助理解

原文日期 2019-12-5 避免误导未来使用正式版的开发者。

 

上一篇我们解释了最简单的ECS示例,写ECS的基本思路就是创建组件、创建实体、编写系统处理逻辑。

我们已经知道,系统是继承了ComponentSystem的类,这是最简单的系统类。

实际上,ComponentSystem有很多的缺点,在实际开发过程中,我们一般会优先使用JobComponentSystem,这样才能最大地发挥ECS的性能。

1.JobComponentSystem

我们之前所使用的ComponentSystem和以前的MonoBehaviour是非常接近的,并且都是在主线程里执行。

ComponentSystem更多的是为了让我们最低成本地把旧项目迁移到ECS模式。

然而,ECS最大的特点之一就是充分利用CPU,这种单线程的使用方式,并不太好。

于是,我们有了JobComponentSystem,一句话概括:我们可以简单地用多线程执行游戏逻辑。

我们来看看代码,组件的代码没有变化,但是,System类需要做一些改动:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

using Unity.Collections;

using Unity.Entities;

using Unity.Jobs;

using Unity.Mathematics;

using Unity.Transforms;

 

public class RotationSpeedSystem_ForEach : JobComponentSystem

{

    protected override JobHandle OnUpdate (JobHandle inputDependencies)

    {

        float deltaTime = Time.DeltaTime;

 

        // Schedule job to rotate around up vector

        var jobHandle = Entities

            .ForEach((ref Rotation rotation, in RotationSpeed_ForEach rotationSpeed) =>

             {

                 rotation.Value = math.mul(

                     math.normalize(rotation.Value),

                     quaternion.AxisAngle(math.up(), rotationSpeed.RadiansPerSecond * deltaTime));

             })

            .Schedule(inputDependencies);

 

        // Return job handle as the dependency for this system

        return jobHandle;

    }

}

唔…对,System变复杂了。

当然,大家都是有游戏开发经验的,理解起来应该很轻松。

看看现在System继承的是什么?是JobComponentSystem,Job是什么?

还记得DOTS包含哪些东西吗?

C#任务系统也就是C# Job System,利用JobSystem,我们可以更方便地利用多线程,提高游戏的性能,并且不用考虑多线程相关的烦人的事情,JobSystem帮我们搞定了。

从上面的代码中可以看到,OnUpdate函数发生了一些变化,这是当然的,因为我们现在继承的是JobComponentSystem:

a. OnUpdate函数需要返回一个JobHandle对象

b. 调用了Entities.ForEach后,接着又调用了Schedule函数,并返回了一个JobHandle对象

其他的逻辑并没有发生太多的变化,顺便一提,参数中的ref代表读写,in代表只读。

所以,现在的JobComponentSystem比起ComponentSystem,有什么优势呢?

优势就是利用上了C# Job System,我们不需要做太多额外的工作,就用上了多线程的功能。

ECS可以让我们稍微花一点点力气就享受到多线程带来的优势,如果花更多的力气,那就能获得更大的提升。

因此,ECS后续还有很多筛选实体数据的方式,我会逐一介绍。

注:如果你的游戏对象非常少,那么,JobComponentSystem无法给你带来太多的提升,直接使用ComponentSystem就可以了。

2.运行

除了System发生了改变,其他内容和上一篇是一样的,大家修改了System类后,运行程序,结果是一样的。

3.Entity Debuger

另外,和大家介绍一个很重要的东西,依次点击Unity菜单的Window->Analysis->EntityDebugger,可以打开ECS的调试窗口:

在运行游戏的时候,我们可以通过Entity Debugger窗口查看到实体、系统等信息:

现在可以先不管那么多,大家自己稍微看看就可以了。

 

注意,本系列教程基于DOTS相关预览版的Package包,是预览版,不代表正式版的时候也适用。

Unity ECS(Entity Component System)是Unity引擎的一种编程范式,它是一种数据驱动的编程模型,它将游戏对象(Entity)分解为数据和行为两个部分,其中数据由组件(Component)来表示,行为则由系统(System)来实现。相对于传统的面向对象编程模型,ECS提供了更高效、更灵活的编程方式,可以有效地提高游戏的性能和扩展性。 下面是我学习Unity ECS时的笔记: ## Entity Entity是ECS中最基本的概念,它表示游戏对象。每个Entity由一个唯一的ID来标识,可以通过EntityManager来创建、销毁、查询和管理Entity。 ## Component Component是Entity的数据部分,用来描述Entity的属性和状态。每个Component包含一些数据成员和一些方法,用来操作这些数据成员。Component是以结构体(struct)的形式定义的,通常只包含数据成员,不包含方法。 ## System System是Entity的行为部分,用来实现游戏逻辑和操作Component。System可以访问和操作EntityManager和Component,但不能直接访问Entity。每个System包含一个或多个Component,表示它所处理的数据类型。System是以类(class)的形式定义的,通常包含一个Update方法,用来实现游戏逻辑。 ## Job Job是一种轻量级的线程,用于并行执行System中的任务。Job可以访问和操作Component,但不能直接访问Entity和EntityManager。Job通常是以结构体(struct)的形式定义的,不包含方法。 ## Archetype Archetype是Entity的集合,包含一组具有相同Component类型的Entity。Archetype可以用来优化数据的访问和处理,可以在不同的System之间共享。 ## Chunk Chunk是Archetype中的数据块,包含一组连续的Entity和它们的Component数据。Chunk可以用来优化内存的分配和访问,可以在Job中进行并行处理。 ## Buffer Buffer是一种Component类型,用来存储可变长度的数据,例如数组或列表。Buffer可以在System和Job中进行修改和访问。 以上是我学习Unity ECS时的笔记,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值