将顶点和面部索引数组加载到OpenGL-ES中的最快方法?

时间:2010-12-01 19:47:50

标签: iphone objective-c opengl-es objective-c++ vertex-array

我正在尝试加载我格式化的.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]);
    }
}

我的一个想法是将数组序列化为二进制文件,然后将它们直接反序列化到我的程序中。虽然没有想出如何做到这一点,但也许这些方面的东西可能是一个解决方案。

2 个答案:

答案 0 :(得分:4)

游戏行业的最佳实践是将所有模型数据保持为二进制格式,这样您就可以非常快速地加载整个非交错的内存块,这些内存块可以表示为顶点,法线或其他任何内容。所需要的一切 - 制作小型命令行工具,将文本.obj文件转换为您自己的二进制文件。

此外:

  • 您是否尝试使用stdio库加载文本,而不是stl ifstream?
  • 也许尝试一次读取所有文本数据并从内存中填充数组,而不是从文件系统填充?
  • 你有多少文件?每次调整std :: vector的大小都会导致新的分配和复制。如果您之前知道所需的音量,请尝试在std :: vector中保留空间。

答案 1 :(得分:0)

我不知道您是否考虑过这一点,但如果您的.obj文件在您的应用程序中不会发生变化,您可以将它们格式化为Objective-C数组并直接使用您的代码进行编译。