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

C# 加载和解析大型文件的最快方法?,c#,opentk,C#,Opentk,我试图在OpenTK中制作一个obj加载程序,它可以工作,但是加载obj文件需要很长时间。以下是我所拥有的: public async void LoadObj() { vertices = new List<Vector3>(); normals = new List<Vector3>(); texCoords = new List<Vector2>(); objVerticesIndexDictionary = new Di

我试图在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;
        }
    }
}
public异步void LoadObj()
{
顶点=新列表();
法线=新列表();
texCoords=新列表();
objVerticesIndexDictionary=新字典();
objVertices=新列表();
三角形=新列表();
quads=新列表();
字符串结果=”;
使用(StreamReader fileRead=新的StreamReader(路径))
{
结果=fileRead.ReadToEnd();
fileRead.Close();
}
字符串[]resultLines=result.Split('\n');
foreach(结果行中的字符串行)
{
控制台。写(“…”);
字符串[]参数=行。拆分(“”);
开关(参数[0])
{
案例“p”://点
打破
案例“v”://顶点
float x=float.Parse(参数[1]);
float y=float.Parse(参数[2]);
float z=float.Parse(参数[3]);
添加(新向量3(x,y,z));
打破
案例“vt”://TexCoord
float u=float.Parse(参数[1]);
float v=float.Parse(参数[2]);
添加(新矢量2(u,v));
打破
案例“vn”://正常
float nx=float.Parse(参数[1]);
float ny=float.Parse(参数[2]);
float nz=float.Parse(参数[3]);
添加(新矢量3(nx,ny,nz));
打破
案例“f”:
开关(参数.长度)
{
案例4:
ObjTriangle ObjTriangle=新的ObjTriangle();
objTriangle.Index0=ParseFaceParameter(参数[1]);
objTriangle.Index1=ParseFaceParameter(参数[2]);
objTriangle.Index2=ParseFaceParameter(参数[3]);
三角形。添加(长方体三角形);
打破
案例5:
ObjQuad ObjQuad=新的ObjQuad();
objQuad.Index0=ParseFaceParameter(参数[1]);
objQuad.Index1=ParseFaceParameter(参数[2]);
objQuad.Index2=ParseFaceParameter(参数[3]);
objQuad.Index3=ParseFaceParameter(参数[4]);
添加(objQuad);
打破
}
打破
}
}
}

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

这些OBJ文件有多大?或者,一个更好的问题,它们包含多少行?你计算出什么需要时间吗?是加载文件、将其拆分为行还是分析每一行?另外,请在发帖时花些时间格式化你的代码——没有任何缩进就很难阅读。基本上所有的obj文件都有加载问题。每个顶点位于一条新线中,与面相同。例如,一个完美的立方体有8个顶点和6个面,所以总共有14条线)。另外,对格式也很抱歉。我不得不把这个贴在手机上,凹痕弄得一团糟。我假设花费时间最多的部分是通过主开关解析每一行的时间。您需要在分析器中运行代码来确定花费时间的部分。据我们所知,在你的
ParseFaceParameter
方法中可能有一些疯狂的事情发生,但我们看不到它的来源。如果您有VS Premium或更高版本,则有一个内置的探查器(分析->性能和诊断)。否则,请看SlimTune。我认为问题不在ParseFaceParameter内——它所做的只是将一个面转换为四边形或三角形。我很确定这只是事实,我现在加载它的方式是每行都循环——对于hipoly模型,它很容易超过5000行。我需要找到一种更有效的加载方法。