在GLKView上方修改UIVIew会导致崩溃

时间:2015-08-02 18:46:11

标签: ios opengl-es opengl-es-2.0 glkview

我的应用程序中有随机崩溃。最终我发现当我添加UIVIew元素并修改它们的中心位置时会发生崩溃。崩溃不会发生在IPad Air 2上,但是场景在IPad Air上是一致的 - 当UIViews打开时,崩溃并且当删除视图时崩溃消失。崩溃与以下堆栈异步发生:

#0  0x0000000190bf1f28 in gpus_ReturnGuiltyForHardwareRestart ()
#1  0x0000000190bf2ec4 in gpusSubmitDataBuffers ()
#2  0x0000000189d56254 in gliPresentViewES_Exec ()
#3  0x0000000189d5616c in gliPresentViewES ()
#4  0x0000000189d63cbc in -[EAGLContext presentRenderbuffer:] ()
#5  0x0000000101ff8078 in EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned long) ()
#6  0x00000001877dc638 in -[GLKView _display:] ()
#7  0x000000018b55eeb8 in CA::Layer::display() ()
#8  0x000000018b5413a0 in CA::Layer::display_if_needed(CA::Transaction*) ()
#9  0x000000018b54108c in CA::Layer::layout_and_display_if_needed(CA::Transaction*) ()
#10 0x000000018b54071c in CA::Context::commit_transaction(CA::Transaction*) ()
#11 0x000000018b540470 in CA::Transaction::commit() ()
#12 0x000000018b539c10 in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) ()
#13 0x000000018666f3f8 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#14 0x000000018666d19c in __CFRunLoopDoObservers ()
#15 0x000000018666d5cc in __CFRunLoopRun ()
#16 0x000000018659d280 in CFRunLoopRunSpecific ()
#17 0x00000001915500cc in GSEventRunModal ()
#18 0x000000018bd8adf8 in UIApplicationMain ()
#19 0x000000010077d36c in main at /Code/splinedr/Splinedr/main.mm:18
#20 0x000000019b7fa8b8 in start ()

我使用[self.view needDisplay]调用渲染OpenGL,并在此之前修改UIViews。

我该如何处理这个问题?

2 个答案:

答案 0 :(得分:2)

确保您的GLKViewController已暂停,并且GLKView的enableSetNeedsDisplay设置为1.如果这些已经设置正确,则可能是您在后台线程上调用setNeedsDisplay,并且您的子视图正在触发主线程上的冲突调用。确保从主线程调用所有对setNeedsDisplay的调用。一种简单的验证方法是在每次调用旁边放一个print语句。

[self.view setNeedsDisplay];
printf("%s\n",dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)); 

另一种方法是将enableSetNeedsDisplay设置为零,然后直接调用[self.view display]。当视图出现并且帧发生变化时,您可能必须在此处添加几个显示调用,但它最终会为您提供更多控制。如果它没有完全解决问题,它至少会更容易跟踪堆栈跟踪,因为所有的绘制调用都将来自您要显示的一个调用。

答案 1 :(得分:0)

Apple表示,一个例外情况表明存在一些背景误用,并强烈建议进入后台的应用暂停或停止使用OpenGL ES。

Apple Documentation for Implementing a Multitasking-Aware OpenGL ES App