C# 加载和解析大型文件的最快方法?
我试图在OpenTK中制作一个obj加载程序,它可以工作,但是加载obj文件需要很长时间。以下是我所拥有的: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
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行。我需要找到一种更有效的加载方法。