2010-12-01 5 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에서 공간을 예약하십시오.
+3

좋은 제안. 필자는 PC에 직접 바이너리 형식을 작성했습니다. 아직 iPad에서 테스트하지는 않았지만 PC로드 시간은 33 초에서 1 초로 늘어 났으며 파일 크기는 17MB에서 7MB로 압축되지 않았으며 3MB에서 1.8MB로 압축되었습니다. 훨씬 낫다. 감사. – Davido

+1

@Davido 당신이 나 자신의 바이너리 형식을 쓰는 방법을 가르쳐 주시겠습니까? "33 초에서 1 초"와우. –

0

당신이 이것을 고려했는지 모르겠지만 .obj 파일이 응용 프로그램에서 변경되지 않으면 객관적인 C 배열로 포맷하고 코드로 직접 컴파일 할 수 있습니다.

+0

이전에 해 본 적이없는 코드 예제가 있습니까? 그게 내가 찾고있는 것 같은데. – Davido

+0

죄송합니다, 명확하게 깜빡. 이것은 당신이 제안한 것을 바꿀 수 있지만, 사용자가 장치에서 새로운 .obj 파일을 열고 OpenGL 뷰어에서 볼 수있게하고 싶습니다. 따라서 정적 파일은 기본적으로 텍스트 파일에 배열에 대한 코드가 있고 런타임에 해당 배열을 직접 컴파일하는 객관적인 방법이없는 한 아무런 의미가 없습니다. – Davido

+0

@Davido 죄송합니다. 객관적 C에 대한 경험이 없습니다. 그것은 단지 제안이었습니다. – Zecc