我正在尝试加载我格式化的.obj文件:
vertexX vertexY vertexZ normalX normalY normalZ
和
index1 index2 index3
格式化为矢量和矢量数组,然后我直接在Opengl-ES中渲染。我的问题是,当我尝试将模型加载到数组中时,加载它们需要大约40秒。我不知道为什么它会变得这么慢,我看到其他代码加载了相同的模型只有几个秒。有什么建议?我加载文件的代码如下:
-(void)loadModel:(NSString*)filePath
{
try {
ifstream objFile([filePath UTF8String]);
objFile >> numVertices;
objFile.ignore(128, '\n');
vertices.resize(numVertices*6);
VertexNormal* vertex = (VertexNormal*) &vertices[0];
svec3* faceDef;
while (objFile) {
char c = objFile.get();
switch (c) {
case 'v':
{
objFile >> vertex->vertices.x >> vertex->vertices.y >> vertex->vertices.z
>> vertex->normals.x >> vertex->normals.y >> vertex->normals.z;
vertex++;
break;
}
case 'f':
{
objFile >> faceDef->x >> faceDef->y >> faceDef->z;
faceDef++;
break;
}
case '#':
{
part newPart;
partList.push_back(newPart);
numObjects++;
objFile.ignore(128, '\n');
int numFaces;
objFile >> numFaces;
partList[partList.size()-1].faces.resize(numFaces*3);
partList[partList.size()-1].numFaces = numFaces;
faceDef = (svec3*) &partList[partList.size()-1].faces[0];
break;
}
default:
break;
}
objFile.ignore(128, '\n');
}
objFile.close();
free(objFile);
} catch (NSException *ex) {
NSLog(@"%@", [ex reason]);
}
}
我的一个想法是将数组序列化为二进制文件,然后将它们直接反序列化到我的程序中。虽然没有想出如何做到这一点,但也许这些方面的东西可能是一个解决方案。
答案 0 :(得分:4)
游戏行业的最佳实践是将所有模型数据保持为二进制格式,这样您就可以非常快速地加载整个非交错的内存块,这些内存块可以表示为顶点,法线或其他任何内容。所需要的一切 - 制作小型命令行工具,将文本.obj文件转换为您自己的二进制文件。
此外:
答案 1 :(得分:0)
我不知道您是否考虑过这一点,但如果您的.obj文件在您的应用程序中不会发生变化,您可以将它们格式化为Objective-C数组并直接使用您的代码进行编译。