我的最新应用程序遇到了一些严重令人沮丧的问题!
我正在使用 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);
,但我在我的代码,当然我很容易错过一个。