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]);
    }
}

私が考えた 1 つの行は、配列をバイナリ ファイルにシリアル化してから、プログラムに直接逆シリアル化することでした。それを行う方法はまだわかりませんが、おそらくこれらの線に沿った何かが解決策になるかもしれません.

4

2 に答える 2

4

ゲーム業界でのベスト プラクティスは、すべてのモデル データをバイナリ形式で保持することです。これにより、頂点、法線などとして表すことができるインターリーブされていないメモリ ブロック全体を非常に高速にロードできます。これに必要なのは、テキスト .obj ファイルを独自のバイナリ ファイルに変換するための小さなコマンド ライン ツールを作成することだけです。

また:

  • stl ifstream ではなく、stdio ライブラリでテキストのロードを試みましたか?
  • すべてのテキスト データを 1 回読み取って、ファイル システムからではなく、メモリから配列を埋めてみませんか?
  • ファイルにはどのくらいのパーツがありますか? std::vector のサイズ変更ごとに、新しい割り当てとコピーが発生します。以前に必要なボリュームがわかっている場合は、std::vector にスペースを予約してみてください。
于 2010-12-02T20:03:26.267 に答える
0

これを考慮したかどうかはわかりませんが、アプリケーションで .obj ファイルが変更されない場合は、それらを目的の C 配列としてフォーマットし、コードで直接コンパイルできます。

于 2010-12-01T22:17:36.457 に答える