问题 gpus_ReturnGuiltyForHardwareRestart崩溃


应用程序在presentFrameBuffer中崩溃(在前台运行时,不会发生中断)。

它没有在第一帧崩溃,它画了一段时间然后它突然崩溃了。

我没有重复的确切步骤,但似乎与绘制某些特定内容有关,但我仍然没有通过应用程序报告openGL错误,包括在presentFrameBuffer之前的一个错误检查。如果我在glFinish中使presentFrameBuffer崩溃之前添加glFinish。

应用程序崩溃与EXC_BAD_ACCESS(代码= 1,地址= 0x1)和上面的调用堆栈没有任何其他错误/日志/调试信息。

这是崩溃时报告的callstack:

线程1,队列:com.apple.main-thread

>     #0    0x36871e46 in gpus_ReturnGuiltyForHardwareRestart ()
>     #1    0x36872764 in gpusSubmitDataBuffers ()
>     #2    0x31eae624 in SubmitPacketsIfAny ()
>     #3    0x378a337a in gliPresentViewES ()
>     #4    0x325b6df2 in -[EAGLContext presentRenderbuffer:] ()
>     #5    0x0052986e in EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned int) ()
>     #6    0x000e2a48 in -[EAGLView presentFramebuffer] at /svn/src_svn/GG/iphone/Classes/EAGLView.mm:228
>     #7    0x000e4066 in -[GGViewController drawFrame] at /svn/src_svn/GG/iphone/Classes/GGViewController.mm:504
>     #8    0x3809ab0a in __NSFireTimer ()
>     #9    0x39d36856 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
>     #10   0x39d36502 in __CFRunLoopDoTimer ()
>     #11   0x39d35176 in __CFRunLoopRun ()
>     #12   0x39ca823c in CFRunLoopRunSpecific ()
>     #13   0x39ca80c8 in CFRunLoopRunInMode ()
>     #14   0x39b9333a in GSEventRunModal ()
>     #15   0x3551b288 in UIApplicationMain ()
>     #16   0x000e1bae in main at /svn/src_svn/GG/iphone/main.m:14

有人对这个有任何线索吗?


6127
2018-01-07 13:29


起源



答案:


如果您使用VAO,这可能是由引用超出顶点缓冲区限制(VBO)的顶点的索引缓冲区(元素数组缓冲区)引起的。

请记住,元素数组缓冲区存储在VAO中,因此只要VAO被绑定,每次调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) 取代 索引缓冲区。如果您在移动到场景的下一个对象时忘记取消绑定VAO,您将改变VAO的VAO 以前 呼叫。

更多信息在这里: http://www.opengl.org/wiki/Vertex_Specification#Index_buffers

一个调试技巧:超大你的顶点缓冲区,它可能会把这个崩溃变成一个小故障,然后你可以使用XCode的OpenGL ES帧捕获工具进行检查(这需要XCode 4.5和iOS 6)。


14
2018-01-17 17:10



很好的调试提示。 - Sulea Cosmin


答案:


如果您使用VAO,这可能是由引用超出顶点缓冲区限制(VBO)的顶点的索引缓冲区(元素数组缓冲区)引起的。

请记住,元素数组缓冲区存储在VAO中,因此只要VAO被绑定,每次调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) 取代 索引缓冲区。如果您在移动到场景的下一个对象时忘记取消绑定VAO,您将改变VAO的VAO 以前 呼叫。

更多信息在这里: http://www.opengl.org/wiki/Vertex_Specification#Index_buffers

一个调试技巧:超大你的顶点缓冲区,它可能会把这个崩溃变成一个小故障,然后你可以使用XCode的OpenGL ES帧捕获工具进行检查(这需要XCode 4.5和iOS 6)。


14
2018-01-17 17:10



很好的调试提示。 - Sulea Cosmin


看起来问题是由GL_TEXTURE1的glEnableClientState(GL_TEXTURE_COORD_ARRAY)引起的,但是没有在顶点缓冲区中提供实际数据。


1
2018-01-09 14:46