Самый быстрый способ загрузки массивов вершин и индексов граней в OpenGL-ES? - PullRequest
3 голосов
/ 01 декабря 2010

Я пытаюсь загрузить файлы .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]);
    }
}

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

Ответы [ 2 ]

4 голосов
/ 02 декабря 2010

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

Также:

  • Вы пытались выполнить загрузку текста с помощью библиотеки stdio, а не stl ifstream?
  • Может быть, попробуйте прочитать все текстовые данные один раз и заполнить массивы из памяти, а не из файловой системы?
  • Сколько частей в файле у вас есть?Каждое изменение размера std :: vector приводит к новому выделению и копированию.Попробуйте зарезервировать место в std :: vector, если вы уже знали, какой объем вам нужен.
0 голосов
/ 02 декабря 2010

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

...