创建 IJob 失败

Ven*_*lev 2 c# unity-game-engine

我正在使用 Unity 2018.3.14。我正在尝试创建一个IJob.

这是我如何称呼新工作的:

var Job = new IncomingDataTCPJob
{
    worldServer = this,
    data = sdata
};

JobHandle handle = Job.Schedule();
handle.Complete();
Run Code Online (Sandbox Code Playgroud)

sdata是字符串,worldServer是类的实例。

这是我的声明struct

public struct IncomingDataTCPJob : IJob
{
    public string data;
    public ClientWorldServer worldServer;

    public void Execute()
    {
        worldServer.OnIncomingData(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行时,出现此错误:

InvalidOperationException: IncomingDataTCPJob.data 不是值类型。作业结构可能不包含任何引用类型。

知道为什么我会收到这个错误吗?我对 Unity 的工作系统真的很陌生。

Eri*_*low 5

作业无法接收不可 blittable 的数据。

根据工作安全文档

C# 作业系统复制数据的方式意味着作业只能访问 blittable 数据类型。

这样做是为了避免竞争条件,例如尝试访问相同内存引用的并行线程。

我不知道为什么您的“字符串数据”字段出现错误,但这可能是一个红鲱鱼。Unity 的作业系统无法与引用类型元素交互。除了 TransformAccessArray(或其他专门的类),作业系统只能用于并行处理原始数据。您不能将自定义的“WorldClientServer”类传递给您的作业结构,因为它不是原始的(因此不是 blittable)。您需要在将所有内容发送到作业之前将其转换为原始数据并将其转换回其引用的对象,以便利用作业系统。

从作业中取回数据的推荐方法是使用NativeQueue 或其他 NativeContainer(它们是线程安全的)。作业系统比标准线程受到更多限制,但可以保护您作为开发人员免于造成噩梦级别的竞争条件错误和内存泄漏。

  • string 也是引用类型,这就是为什么他也出​​现错误 (2认同)