2010-12-01 52 views
3

我試圖加載的obj,我已經格式化成文件:將頂點和麪的索引數組加載到OpenGL-ES的最快方法?

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

遊戲行業的最佳實踐是將所有模型數據保存爲二進制格式,因此您可以非常快地加載可以表示爲頂點,法線或其他任何內容的整個非交錯塊。所有你需要的 - 製作一個用於將文本.obj文件轉換爲你自己的二進制文件的小命令行工具。

另外:

  • 你嘗試做文字加載與stdio庫,而不是STL ifstream的?
  • 也許嘗試讀取所有文本數據一次,並從內存,而不是從文件系統填充數組?
  • 你有多少部分文件?每個std :: vector的大小都會導致新的分配和複製。如果您之前知道所需的音量,請嘗試在std :: vector中保留空間。
0

我不知道你是否考慮過這個,但是如果你的.obj文件在你的應用程序中不會改變,你可以將它們格式化爲Objective-C數組,並用你的代碼直接編譯它們。

+0

我從來沒有這樣做過,你有一個關於你如何做的代碼示例?聽起來像它可能是我正在尋找。 – Davido 2010-12-01 22:38:54

+0

對不起,我忘了澄清。這可能會改變你的建議,但我希望用戶能夠從他們的設備中打開NEW .obj文件並在我的OpenGL查看器中查看這些文件。所以靜態文件是不行的,除非有一種方法可以在文本文件中基本擁有數組的代碼,並且可以在運行時直接編譯這些數組。 – Davido 2010-12-01 22:54:39

相關問題