我有一个IJobParallelFor
,其中每个作业都会创建一个数据数组
我尝试使用NativeArray<float[]>
,但由于它是引用类型,所以不起作用,而我尝试了NativeArray<NativeArray<float>>
,但由于
...但是,包含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]);
}
}
我知道还有其他算法不是n ^ 2可以做到的,但这只是一个真实问题的玩具示例。
答案 0 :(得分:3)
如果我正确理解了这个问题,那么Unity NativeMultiHashMap可以为您提供帮助。您可以尝试以下操作:
public NativeMultiHashMap<float, NativeArray<float>> FooBar
= new NativeMultiHashMap<float, NativeArray<float>>();
您现在可以随时使用该键将值添加为NativeArray。
答案 1 :(得分:2)
此外,您还可以获取NativeArray指针,将其存储在IntPtr中,然后将其(而不是数组本身)添加到数组中(这是规避数组嵌套限制的一种方法)。因此,在代码中使用数组时,只需将它们转换回数组即可(我通常使用UnsafeUtility和UnsafeUtilityEx方法)。
答案 2 :(得分:0)
基于Raph_Wa遮阳篷,我使用了
NativeHashMap<int, NativeList<Vector3>> distance;
然后每个作业都会获得一个列表
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);
}