iphone - 导航时 iPhone OpenGL 应用程序随机崩溃

标签 iphone objective-c opengl-es crash

我正在开发一个混合了 OpenGL ES 和常规 iPhone UI 的 iPhone 应用程序。这意味着有一个 EAGLView 问候用户,然后是一些常规的 UIView 被推到它上面(有一个 UINavigationController 作为根 Controller ) .

从 subview 导航回来时,我遇到了随机(但非常频繁)的崩溃。这是来自 Release 构建的(...审查...)堆栈跟踪,但它在 Debug 中崩溃了。

#0  0x006863d0 in GetFBOBuffers ()
#1  0x00660120 in TerminateScene ()
#2  0x00660314 in FlushScene ()
#3  0x00660cd4 in FlushHW ()
#4  0x0066a6a0 in GLESPresentView ()
#5  0x323533a4 in -[EAGLContext presentRenderbuffer:] ()
#6  0x000026c0 in -[EAGLView presentFramebuffer] (self=0x11ce60, _cmd=<value temporarily unavailable, due to optimizations>) at (...)/Classes/EAGLView.m:157
#7  0x00004fdc in -[(...)ViewController drawFrame] (self=<value temporarily unavailable, due to optimizations>, _cmd=<value temporarily unavailable, due to optimizations>) at (...)    ViewController.m:380
#8  0x336ebd9a in __NSFireTimer ()
#9  0x323f54c2 in CFRunLoopRunSpecific ()
#10 0x323f4c1e in CFRunLoopRunInMode ()
#11 0x335051c8 in GSEventRunModal ()
#12 0x324a6c30 in -[UIApplication _run] ()
#13 0x324a5230 in UIApplicationMain ()
#14 0x0000214c in main (argc=1, argv=0x2ffff568) at (...)/main.m:14

这是我所知道的事情的列表:

  • 我的应用没有收到内存警告。
  • 我的应用在 Instruments 下没有发现泄漏。
  • 模拟器上没有崩溃,但有时会出现非常明显的延迟。
  • 在崩溃之前,Instruments/OpenGL/ResourceBytes 中有大量已发布的数据。
  • 我同时使用 VBO 和顶点/纹理坐标/法线数组。

所以我知道它一定是某种被释放或销毁的数据,但我不知道如何找到。任何提示和技巧将不胜感激;-)

更新:

在设置一些断点后,沿着堆栈移动,查看各种变量,我找到了崩溃的原因,但还没有找到源头。

在 EAGLView 中,在方法 presentFramebuffer 中发生崩溃的时间和地点,如果我相信 gdb,colorRenderBuffer ivar 为 0,即使在它为 0 时尝试断点似乎不起作用。

layoutSubviewsdeleteFrameBuffer 调用似乎与 createFramebuffer 不匹配。

更新 2:

后来有很多断点......我发现了一个错误的情况:[EAGLView layoutSubviews]drawFrame 的中间被调用 !所以缓冲区在使用时会被删除...... BAM!

现在我该如何解决那个

最佳答案

我还没有找到“合适”的修复方法,但我已经添加了一个解决方法。

presentFramebuffer 中,我在渲染周围设置了一个 bool 值:

if (context)
{
    isRendering_PATCH_VARIABLE = YES;

    [EAGLContext setCurrentContext:context];

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);

    success = [context presentRenderbuffer:GL_RENDERBUFFER_OES];

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, 0);

    isRendering_PATCH_VARIABLE = NO;
}

deleteFramebuffer 中,我检查了这个 bool 值:

if (isRendering_PATCH_VARIABLE)
{
    NSLog(@"GOTCHA - CRASH AVOIDED");   
}

if (context && !isRendering_PATCH_VARIABLE)
{
    // ...
}

它似乎没有副作用(比如显示损坏等),所以我暂时就这样吧。

关于iphone - 导航时 iPhone OpenGL 应用程序随机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098484/

相关文章:

iphone - 为什么此代码无法使用 MPMoviePlayerController 播放歌曲

objective-c - 是否可以看到 Objective-C ARC 输出?

android - 截取 Android OpenGL 的屏幕截图

objective-c - cellForRowAtIndexPath 未被调用

opengl-es - 如何在 GLSL 中编写片段着色器来对 9 个 float 的数组进行排序

java - 3D 对象相遇处的不平整边缘和故障

iphone - iOS 状态栏 : how to show some text there

iphone - 优化此核心数据请求

iphone - 如何使用 TouchXML 或其他替代方案解析 HTML

objective-c - 如何将用户重定向到我的应用程序 (IOS) 的专业版