Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 统一作业系统与多维数组_Unity3d - Fatal编程技术网

Unity3d 统一作业系统与多维数组

Unity3d 统一作业系统与多维数组,unity3d,Unity3d,我有一个IJobParallelFor,其中每个作业都创建一个数据数组 我尝试过使用NativeArray,但不起作用,因为它是引用类型,我尝试过NativeArray,但不起作用,因为 …但是,包含blittable变量数组的类型 类型本身不是可轻击的 资料来源: 有没有办法绕过这个问题而不用使用一个巨大的一维数组并手工计算索引?这并不好,因为您必须使用[NativeDisableParallelForRestriction]来访问每个作业范围之外的数组 我的工作: public struct

我有一个
IJobParallelFor
,其中每个作业都创建一个数据数组

我尝试过使用
NativeArray
,但不起作用,因为它是引用类型,我尝试过
NativeArray
,但不起作用,因为

…但是,包含blittable变量数组的类型 类型本身不是可轻击的

资料来源:

有没有办法绕过这个问题而不用使用一个巨大的一维数组并手工计算索引?这并不好,因为您必须使用
[NativeDisableParallelForRestriction]
来访问每个作业范围之外的数组

我的工作:

public struct DistanceJob : IJobParallelFor
{
    [NativeDisableParallelForRestriction] public NativeArray<float> distance;
    [ReadOnly] public NativeArray<Vector2> position;

    public void Execute(int i)
    {
        for (int j = 0; j < position.Length; j++)
            distance[i * position.Length + j] = Vector2.Distance(position[i], position[j]);
    }
}
公共结构距离作业:IJobParallelFor
{
[NativeDisableParallelForRestriction]公共国家阵列距离;
[只读]公共本地阵列位置;
公共无效执行(int i)
{
对于(int j=0;j

我知道还有其他算法不是n^2,但这只是一个真实问题的玩具示例。

如果我正确理解这个问题,Unity NativeMultiHashMap可以帮助您。您可以尝试以下方法:

public NativeMultiHashMap<float, NativeArray<float>> FooBar 
             = new NativeMultiHashMap<float, NativeArray<float>>();
public NativeMultiHashMap FooBar
=新的NativeMultiHashMap();

现在,您可以随时使用该键添加一个值作为NativeArray。

基于Raph_Wa awnser,我使用了

NativeHashMap<int, NativeList<Vector3>> distance;
NativeHashMap距离;
然后每个作业都会得到一个列表

public void Execute(int i)
{
    NativeList<Vector3> a;
    distance.TryGet(i, out a);

    for (int j = 0; j < position.Length; j++)
        a[j] = Vector2.Distance(position[i], position[j]);

    distance.TryAdd(i, a);
}
public void Execute(inti)
{
民族主义者a;
距离TryGet(i,out a);
对于(int j=0;j
此外,您还可以获取NativeArray指针,将其存储在IntPtr中,并将其(而不是数组本身)添加到数组中(这是一种规避数组嵌套限制的方法)。因此,在代码中使用数组时,只需将它们转换回数组(我通常使用UnsafeUtility和UnsafeUtilityEx方法)