Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将顶点数组和面索引加载到OpenGL ES的最快方法?_Iphone_Objective C_Opengl Es_Objective C++_Vertex Array - Fatal编程技术网

Iphone 将顶点数组和面索引加载到OpenGL ES的最快方法?

Iphone 将顶点数组和面索引加载到OpenGL ES的最快方法?,iphone,objective-c,opengl-es,objective-c++,vertex-array,Iphone,Objective C,Opengl Es,Objective C++,Vertex Array,我正在尝试加载已格式化为的.obj文件: vertexX vertexY vertexZ normalX normalY normalZ 以及: 格式化为向量和向量数组,然后直接在Opengl ES中渲染。我的问题是,当我尝试将模型加载到阵列中时,加载它们大约需要40秒。我不知道为什么速度会这么慢,我见过其他代码在几秒钟内加载相同的模型。有什么建议吗?我加载文件的代码如下: -(void)loadModel:(NSString*)filePath { try { ifstre

我正在尝试加载已格式化为的.obj文件:

vertexX vertexY vertexZ normalX normalY normalZ
以及:

格式化为向量和向量数组,然后直接在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]);
    }
}

我的一个想法是将数组序列化为二进制文件,然后直接反序列化到我的程序中。虽然还没有弄清楚如何做到这一点,但也许可以采用类似的解决方案。

我不知道您是否考虑过这一点,但如果您的.obj文件在应用程序中不会更改,您可以将它们格式化为objective-C数组,并直接用代码进行编译。

游戏行业的最佳实践是将所有模型数据保持为二进制格式,这样您就可以非常快速地加载整个非交错内存块,这些内存块可以表示为顶点、法线或其他任何形式。您只需制作一个小型命令行工具,将text.obj文件转换为您自己的二进制文件

此外:

  • 您是否尝试使用stdio库而不是stl ifstream加载文本
  • 也许尝试一次读取所有文本数据并从内存而不是从文件系统填充数组
  • 你的档案里有多少零件?std::vector的每次调整都会导致新的分配和复制。如果您以前知道所需的卷,请尝试在std::vector中保留空间

我以前从未这样做过,您是否有一个代码示例来说明如何做到这一点?听起来可能就是我要找的。对不起,我忘了澄清。这可能会改变您的建议,但我希望用户能够从他们的设备打开新的.obj文件,并在我的OpenGL查看器中查看这些文件。因此,静态文件是不可行的,除非有一种方法基本上将数组的代码放在文本文件中,并让objective-c在运行时直接编译这些数组。@Davido抱歉,我对objective-c没有任何经验。这只是一个建议。很好的建议。我最终在电脑上编写了自己的二进制格式。还没有在iPad上测试过,但电脑上的加载时间从33秒变为1秒,文件大小从17MB变为7MB未压缩,3MB变为1.8MB压缩。好多了。谢谢。@Davido你能告诉我怎么写自己的二进制格式吗?“33秒到1秒”刚刚好。
-(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]);
    }
}