2010-12-01 2 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 библиотеки, а не СТЛ ifstream?
  • Возможно, попробуйте прочитать все текстовые данные один раз и заполнить массивы из памяти, а не из файловой системы?
  • Сколько у вас частей в файле? Каждый размер std :: vector приводит к новому распределению и копированию. Попытайтесь зарезервировать место в std :: vector, если раньше вы знали желаемый объем.
0

Я не знаю, считали ли вы это, но если ваши .obj-файлы не будут изменяться в вашем приложении, вы можете отформатировать их как массивы объектных-C и скомпилировать их непосредственно с вашим кодом.

+0

Я никогда не делал этого раньше, у вас есть пример кода, как вы это сделаете? Похоже, это может быть то, что я ищу. – Davido 2010-12-01 22:38:54

+0

Извините, я забыл прояснить. Это может изменить то, что вы предлагаете, но я хотел бы, чтобы пользователь мог открыть NEW .obj-файлы со своего устройства и просмотреть их в моем средстве просмотра OpenGL. Таким образом, статические файлы не идут, если нет способа получить код для массивов в текстовом файле и объектно-скомпилировать эти массивы непосредственно во время выполнения. – Davido 2010-12-01 22:54:39

 Смежные вопросы

  • Нет связанных вопросов^_^