Iphone 将顶点数组和面索引加载到OpenGL ES的最快方法?
我正在尝试加载已格式化为的.obj文件:Iphone 将顶点数组和面索引加载到OpenGL ES的最快方法?,iphone,objective-c,opengl-es,objective-c++,vertex-array,Iphone,Objective C,Opengl Es,Objective C++,Vertex Array,我正在尝试加载已格式化为的.obj文件: vertexX vertexY vertexZ normalX normalY normalZ 以及: 格式化为向量和向量数组,然后直接在Opengl ES中渲染。我的问题是,当我尝试将模型加载到阵列中时,加载它们大约需要40秒。我不知道为什么速度会这么慢,我见过其他代码在几秒钟内加载相同的模型。有什么建议吗?我加载文件的代码如下: -(void)loadModel:(NSString*)filePath { try { ifstre
vertexX vertexY vertexZ normalX normalY normalZ
以及:
格式化为向量和向量数组,然后直接在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]);
}
}
我的一个想法是将数组序列化为二进制文件,然后直接反序列化到我的程序中。虽然还没有弄清楚如何做到这一点,但也许可以采用类似的解决方案。我不知道您是否考虑过这一点,但如果您的.obj文件在应用程序中不会更改,您可以将它们格式化为objective-C数组,并直接用代码进行编译。游戏行业的最佳实践是将所有模型数据保持为二进制格式,这样您就可以非常快速地加载整个非交错内存块,这些内存块可以表示为顶点、法线或其他任何形式。您只需制作一个小型命令行工具,将text.obj文件转换为您自己的二进制文件 此外:
- 您是否尝试使用stdio库而不是stl ifstream加载文本
- 也许尝试一次读取所有文本数据并从内存而不是从文件系统填充数组
- 你的档案里有多少零件?std::vector的每次调整都会导致新的分配和复制。如果您以前知道所需的卷,请尝试在std::vector中保留空间
-(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]);
}
}