Как я могу использовать что-то вроде NativeList>?или любые другие альтернативные способы? - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь вычислить нормали меша вручную, используя систему заданий для повышения производительности.В моем решении я пытаюсь использовать что-то вроде NativeList>.Но когда я скомпилировал, я получил сообщение об ошибке:

ArgumentException: Unity.Collections.NativeList`1 [UnityEngine.Vector3Int], используемый в нативной коллекции, не является blittable или примитивным

Есть ли я в любом случаеможно это исправить?

Спасибо, ребята!

public class NormalCalculatorJobSystem
{
List<List<Vector3Int>> verticesAdjFaces;
List<Vector3> normals;
Mesh mesh = null;

NativeArray<int> nativeIndices;
NativeList<NativeList<Vector3Int>> nativeVerticesAdjFaces;
NativeList<Vector3> nativeNormals;
NativeArray<Vector3> nativeVertices;

InitAdjacentFacesJob initAdjacentFacesJob;
JobHandle initAdjacentFacesJobHandle;

CalculateNormalsJob calculateNormalsJob;
JobHandle calculateNormalsJobHandle;

public void Init(Mesh _mesh)
{
    mesh = _mesh;
    verticesAdjFaces = new List<List<Vector3Int>>();


    nativeIndices = new NativeArray<int>(mesh.triangles, Allocator.Temp);

    //ArgumentException: Unity.Collections.NativeList`1[UnityEngine.Vector3Int] used in native collection is not blittable or primitive
    nativeVerticesAdjFaces = new NativeList<NativeList<Vector3Int>>(mesh.vertexCount,Allocator.Temp);


    nativeNormals = new NativeList<Vector3>(mesh.normals.Length, Allocator.Temp);
    nativeVertices = new NativeArray<Vector3>(mesh.vertices, Allocator.Temp);

    InitAdjacentFaces();
}

public void InitAdjacentFaces() {

    initAdjacentFacesJob = new InitAdjacentFacesJob
    {
        indices = nativeIndices,
        verticesAdjFaces = nativeVerticesAdjFaces,
    };

    initAdjacentFacesJobHandle = initAdjacentFacesJob.Schedule(mesh.vertexCount, 64);
    initAdjacentFacesJobHandle.Complete();
}

public struct InitAdjacentFacesJob : IJobParallelFor
{
    public NativeArray<int> indices;
    public NativeList<NativeList<Vector3Int>> verticesAdjFaces;
    public void Execute(int i)
    {
        NativeList<Vector3Int> list = new NativeList<Vector3Int>();
        for (int j = 0; j < indices.Length; j += 3)
        {
            if (list.Length > 6)
                continue;
            if (i == indices[j] || i == indices[j + 1] || i == indices[j + 2])
            {
                Vector3Int triangle = new Vector3Int(indices[j], indices[j + 1], indices[j + 2]);
                list.Add(triangle);
            }
        }
        verticesAdjFaces.Add(list);
    }
}


public void CalculateNormals(Mesh mesh)
{
    nativeNormals.Clear();
    calculateNormalsJob = new CalculateNormalsJob
    {
        vertices = nativeVertices,
        verticesAdjFaces = nativeVerticesAdjFaces,
        normals = nativeNormals
    };
    calculateNormalsJobHandle = calculateNormalsJob.Schedule(nativeVerticesAdjFaces.Length, 64,initAdjacentFacesJobHandle);
    calculateNormalsJobHandle.Complete();
    normals = new List<Vector3>(nativeNormals.ToArray());
    mesh.SetNormals(normals);
}

public struct CalculateNormalsJob : IJobParallelFor {
    public NativeArray<Vector3> vertices;
    public NativeList<NativeList<Vector3Int>> verticesAdjFaces;
    public NativeList<Vector3> normals;
    public void Execute(int i)
    {
        NativeList<Vector3Int> adjFaces = verticesAdjFaces[i];
        Vector3 normal = Vector3.zero;
        for (int j = 0; j < adjFaces.Length; j++)
        {
            Vector3Int triangle = adjFaces[j];
            Vector3 vec0 = vertices[triangle.y] - vertices[triangle.x];
            Vector3 vec1 = vertices[triangle.z] - vertices[triangle.x];
            normal += Vector3.Cross(vec0, vec1);
        }
        normal.Normalize();
        normals.Add(normal);
    }
}

}

1 Ответ

0 голосов
/ 30 апреля 2019

Blittable тип - это тип, который имеет каноническое представление как в управляемом, так и в неуправляемом коде.Вы можете прочитать больше о них здесь .

Для DOTS Unity изобрела свои собственные типы значений blittable, которые больше похожи на те, что вы видели бы в языке затенения, таком как HLSL.Для векторов у вас есть float2, float3, float4 и т. Д. У вас также есть float4x4 для матриц.В вашем случае вы хотите int3, а не Vector3Int.Одно из преимуществ использования этих новых типов заключается в том, что они могут использовать SIMD-операции (одиночная инструкция, несколько данных), что позволяет использовать арифметические операции со всеми 3 значениями в одной инструкции.

Эти новые типы также имеют свои собственныевнутренние операции для таких вещей, как перекрестные и точечные продукты.Вы можете найти библиотеку математики на GitHub .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...