加载和解析大文件的最快方法?

时间:2015-03-06 17:28:33

标签: c# opentk

我试图在OpenTK中创建一个obj加载器,但它可以工作,但加载obj文件需要很长时间。这就是我所拥有的:

public async void LoadObj()
{
    vertices = new List<Vector3>();
    normals = new List<Vector3>();
    texCoords = new List<Vector2>();
    objVerticesIndexDictionary = new Dictionary<ObjVertex, int>();
    objVertices = new List<ObjVertex>();
    triangles = new List<ObjTriangle>();
    quads = new List<ObjQuad>();

    string result = "";
    using (StreamReader fileRead = new StreamReader(path))
    {
        result = fileRead.ReadToEnd();
        fileRead.Close();
    }
    string[] resultLines = result.Split('\n');
    foreach (string line in resultLines)
    {
        Console.Write("...");
        string[] parameters = line.Split(' ');
        switch (parameters[0])
        {
            case "p": // Point
                break;

            case "v": // Vertex
                float x = float.Parse(parameters[1]);
                float y = float.Parse(parameters[2]);
                float z = float.Parse(parameters[3]);
                vertices.Add(new Vector3(x, y, z));
                break;

            case "vt": // TexCoord
                float u = float.Parse(parameters[1]);
                float v = float.Parse(parameters[2]);
                texCoords.Add(new Vector2(u, v));
                break;

            case "vn": // Normal
                float nx = float.Parse(parameters[1]);
                float ny = float.Parse(parameters[2]);
                float nz = float.Parse(parameters[3]);
                normals.Add(new Vector3(nx, ny, nz));
                break;

            case "f":
                switch (parameters.Length)
                {
                    case 4:
                        ObjTriangle objTriangle = new ObjTriangle();
                        objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                        objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                        objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                        triangles.Add(objTriangle);
                        break;

                    case 5:
                        ObjQuad objQuad = new ObjQuad();
                        objQuad.Index0 = ParseFaceParameter(parameters[1]);
                        objQuad.Index1 = ParseFaceParameter(parameters[2]);
                        objQuad.Index2 = ParseFaceParameter(parameters[3]);
                        objQuad.Index3 = ParseFaceParameter(parameters[4]);
                        quads.Add(objQuad);
                        break;
                }
                break;
        }
    }
}

如您所见,LoadObj()将读取指定的obj文件并为每一行运行一个开关。不知道这个系统有多高效,我还在学习C#。加载obj文件有更快更有效的方法吗?谢谢。

0 个答案:

没有答案