【发布时间】:2011-05-05 03:37:56
【问题描述】:
我正在开发一个混合 OpenGL ES 和常规 iPhone UI 的 iPhone 应用程序。这意味着有一个EAGLView 向用户致意,然后是一些常规的UIViews 被推到它上面(有一个UINavigationController 作为根控制器)。
从子视图返回时,我遇到了随机(但非常频繁)崩溃。这是一个(...审查过的...)堆栈跟踪,来自 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 和 vertex/texcoord/normals 数组。
所以我知道一定是某种数据被释放或销毁,但我不知道如何找到。任何提示和技巧将不胜感激;-)
更新:
在设置了一些断点,沿着堆栈移动,查看各种变量后,我找到了崩溃的原因,但还没有找到根源。
在 EAGLView 中,在发生崩溃的位置和时间的方法 presentFramebuffer 中,如果我相信 gdb,colorRenderBuffer ivar 为 0,即使在它为 0 时尝试断点似乎不起作用。
似乎来自layoutSubviews 的deleteFrameBuffer 调用与createFramebuffer 不匹配。
更新 2:
后来有很多断点...我发现了一个错误的情况:[EAGLView layoutSubviews] 被调用 在 drawFrame 的中间!所以缓冲区在使用时会被删除...... BAM!
现在我该如何解决那个?
【问题讨论】:
-
听起来你可能正在双重释放某些东西......
-
好吧,我自己并没有释放任何东西。一个视图被推送到我的 OpenGL 视图上,然后弹出,然后在前几次渲染中崩溃。
-
我想要一个真正的解决方案,它会让我更好地理解 UIKit 与 OpenGL ES 的交互。添加了赏金。
-
有趣的问题。没有代码,我们很难提供帮助。我认为你是对的,找到根本原因很重要。思路:在draw中间调用deleteFrameBuffer的栈是什么样子的?它在什么线程上?放入一些日志以显示调用各种关键函数时它们所在的线程。
-
好吧,代码几乎是标准的 OpenGL ES 模板。堆栈很长,在一个线程上。我正忙于其他优先事项(项目截止日期快到了),之后我会尝试发布堆栈跟踪。
标签: iphone objective-c opengl-es crash