3

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

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

4

2 回答 2

4

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

还:

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

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

于 2010-12-01T22:17:36.457 回答