当前位置:首页 > 游戏信息 > 正文

Unity DOTS(一) Job System 介绍

Unity DOTS(一) Job System 介绍-第1张-游戏信息-龙启网

Unity C# Job System,通常简称为Job System,是Unity开发的一款基于C#的多线程管理系统。它允许开发者利用多线程技术,在Unity中处理游戏逻辑,而不再局限于传统的单线程模式。

尽管Unity支持多线程,但在主逻辑模块并没有很好地支持多线程。原因在于,传统的多线程在处理游戏逻辑时存在一些问题。例如,游戏逻辑代码执行成本低,但需要在短时间内执行大量代码块。此外,多线程编程本身也存在复杂度问题,如线程冲突和依赖关系,容易引起难以调试的异常。

然而,随着现代手机CPU核心数量的增加,未能充分利用这些核心资源将是一种极大的资源浪费。因此,Unity在推出ECS的同时,也推出了Job System,以充分利用多核CPU的能力。

在Job System中,Job的概念与线程相对应,但Job并不是对线程的封装。可以将Job理解为处理单一逻辑的函数。Job System会在初始化时创建CPU核心数减1的线程,并将所有Job分配到这些线程中并行执行。这种设计可以减少频繁创建线程的成本,降低因多个线程抢占CPU资源而引起的损耗,从而更充分地利用CPU资源。

Job的实际代码实现如下:整个Job是一个实现IJob接口的struct,包含输入参数、结果和执行逻辑。NativeArray类型的result是DOTS引入的一部分,用于让不同的Job能访问共享的内存。

Job的调用代码如下:通过创建Job struct,并使用Schedule方法将其安排到线程中。Schedule方法返回一个JobHandle,调用JobHandle.Complete()可以确保Job执行完成。为了实现并行执行,需要在调用JobHandle.ScheduleBatchedJobs()后再调用Complete()。

此外,Job System还处理了依赖执行问题,Schedule()方法的重载可以将依赖的Job的JobHandle传入。关于NativeContainer,它主要用于不同Job之间传递数据,处理多线程的写冲突问题。

在Job System中,开发者需要考虑NativeContainer的写入权限、依赖关系和内存回收等问题。为了解决这些问题,可以采用标记、调整数据组织方式等方法。