我正在开发一个混合了 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 时尝试断点似乎不起作用。
layoutSubviews
的 deleteFrameBuffer
调用似乎与 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/