gpt4 book ai didi

c# - 创建 IJob 失败

转载 作者:行者123 更新时间:2023-12-05 02:10:15 24 4
gpt4 key购买 nike

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

我是这样称呼新工作的:

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

JobHandle handle = Job.Schedule();
handle.Complete();

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

这是我声明的struct:

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

public void Execute()
{
worldServer.OnIncomingData(data);
}
}

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

InvalidOperationException: IncomingDataTCPJob.data is not a value type. Job structs may not contain any reference types.

知道为什么我会收到此错误吗?我对 Unity 的 Job 系统真的很陌生。

最佳答案

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

According to the Jobs Safety documentation :

The way the C# Job System copies data means that a job can only access blittable data types.

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

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

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

关于c# - 创建 IJob 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58941452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com