0

我的最新应用程序遇到了一些严重令人沮丧的问题!

我正在使用 OpenGLES 1 将不断更新的模型绘制到屏幕上,然后您可以截取屏幕截图并随意分享,之后您可以返回应用程序开始屏幕并重新开始。

应用程序第一次运行时似乎一切正常,没有崩溃。但是如果你运行一次然后尝试再次运行,一旦 OpenGLES 绘图视图必须开始绘制元素,它就会在我的行上抛出一个EXC_BAD_ACCESS错误。glDrawElements

我暂时放弃尝试修复此错误,过去 2 周我没有运气!!

我已经在我的 plist 中设置了该属性,以便该应用程序不会在后台运行,并且每当我运行它一次,然后退出它并再次加载它时,它会再次运行,绝对没问题。

所以我想知道我是否可以以某种方式模拟该功能的exit(0)功能,但实际上不退出应用程序?

所以本质上,每次用户从共享页面导航回到主页时,应用程序都会运行exit代码,让应用程序再次从头开始运行。

至少在我看来,这根本不是处理这种情况的好方法,但我需要快速得到结果,这似乎是一个很好的出路,直到我能够深入了解实际错误。

谢谢,

马特

编辑 1:我不希望将应用程序放在商店中并进行此修复,这只是暂时的。

编辑 2:发布的代码包含我的绘图功能,取自Bill Dudney 的 WaveFront .obj 加载器并改编自

for(WaveFrontOBJGroup *group in scene.groups)
{
    NSString *matPath = [NSString stringWithFormat:@"%@%@.mtl", materialName, modelPart];
    NSArray *materialArray = [WaveFrontOBJMaterial materialsFromLibraryFile:matPath];
    WaveFrontOBJMaterial *mat = [materialArray objectAtIndex:0];

    if(group.smoothing)
        glShadeModel(GL_SMOOTH);
    else
        glShadeModel(GL_FLAT);

    // load (if necessary) and bind the vertices
    GLuint verticesName = [group verticesName:GL_STATIC_DRAW];
    glBindBuffer(GL_ARRAY_BUFFER, verticesName);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    // load (if necessary) and bind the normals
    GLuint normalsName = [group normalsName:GL_STATIC_DRAW];
    glBindBuffer(GL_ARRAY_BUFFER, normalsName);
    glNormalPointer(GL_FLOAT, 0, 0);

    ColorRGBA color = mat.ambientColor;
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat *)&color);
    color = mat.diffuseColor;
    if(alpha)
        glColor4f(color.red, color.green, color.blue, mat.disolve);
    else
        glColor4f(color.red, color.green, color.blue, color.alpha);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (GLfloat *)&color);
    color = mat.specularColor;
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat *)&color);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat.shine);

    // load (if necessary) and bind the texture
    if(group.textureCoordinatesIndexData.length > 0)
    {
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        GLuint textureCoordsName = [group textureCoordinatesName:GL_STATIC_DRAW];
        glEnable(GL_TEXTURE_2D);
        glBindBuffer(GL_ARRAY_BUFFER, textureCoordsName);
        glTexCoordPointer([group texCoordSize], GL_FLOAT, 0, 0);
        GLuint texId = [mat.diffuseTexture textureName];
        glBindTexture(GL_TEXTURE_2D, texId);
    }

    GLuint indexesName = [group indexesName:GL_STATIC_DRAW];
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexesName);

    glDrawElements(GL_TRIANGLES, group.indexCount, GL_UNSIGNED_SHORT, NULL);
    //^^This line above is where I get the "EXC_BAD_ACCESS" message

    if(group.textureCoordinatesIndexData.length > 0)
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

我检查group.indexCount了断点和 NSLog,它不为空,它与第一次运行时完全相同,效果很好。

我意识到它不一定会在那条线上,我听说过其他人谈论它是由于变量没有被初始化为指针*- 或者 NSStrings 没有匹配的标识符和值(@"%@ sometext %@", variable);,但我在我的代码,当然我很容易错过一个。

4

2 回答 2

0

我不确定为什么您的应用程序无法在模拟器上编译,但您应该尝试适当地链接您的库,以便您可以启动并运行它 - 没有什么比僵尸更好的访问错误。

如果您知道您的错误来自调用,glDrawElements那么您应该查看传递给它的内容。此链接可能会对您有所帮助。

您无法在应用程序中获得退出应用程序的“功能”的原因是它不是应用程序的功能 - 它是操作系统丢弃与应用程序相关的所有内容然后重新加载它。根据定义,如果不实际关闭,您将无法执行此操作。

但是,如果您的问题由此得到解决,那么您的设置中可能有一些需要重做的东西(初始化、声明等)。检查以查看设置nil或丢弃的内容,然后将其重新设置。

如果不查看您的代码,我不能肯定地说,但是您可以编写一个方法来覆盖/重新初始化所有当前变量。这可能会复制您需要的退出应用程序的部分。

于 2012-07-17T13:00:36.113 回答
0

记住两点:

1)您-(void)viewWillAppear:(BOOL)animated的家庭 ViewController 中有一个方法。当用户返回此屏幕时,这将始终调用(!)(不像 viewDidLoad)。

2)如果您甚至像您描述的那样执行此操作,您可能还没有进入 AppStore!

于 2012-07-17T11:42:16.673 回答