2014-04-08 203 views
0

在iOS 7.1(其中multiThreadedEAGLContext被引入)时,我收到了很多错误“OpenGL Thread Conflict Detected”。OpenGL线程冲突检测

我已经在上下文中设置了multiThreaded = YES,但仍然收到错误消息。很奇怪,因为我得到的输出很多相同的错误:

OpenGL Thread Conflict Detected 
0x17022cd40 

我认为是十六进制线程ID - 这似乎是一致的。 为什么我得到这个错误输出的任何想法?

+2

你是不是想从多个线程访问EAGLContext,是吗?我不认为这会使EAGLContext线程安全,它只是将一些CPU端指令卸载到帮助程序线程上,以加快速度。 –

+0

@BradLarson是对的:所有'multiThreaded'属性都会卸载与OpenGL ES调用相关的CPU工作(例如,在将顶点缓冲区上传到GPU之前先格式化顶点缓冲区)。要从多个线程处理GL,您应该为每个线程使用一个单独的上下文(如果您希望它们共享资源,则使用共享组)。如果你这样做,那么对于在后台线程上的上下文设置'multiThreaded = YES'是没有意义的(对于主线程上的那个上下文,可能很少,因为你已经将所有CPU繁重的工作卸载到后台线程,对不对?)。 – rickster

+0

我不相信我在多个线程上使用'EAGLContext'。我的意思是,每当它发出警告时,它会在每次运行中打印一个不同的地址,但在多个警告中,它是相同的地址(在我的程序的完全不同的区域中)。 @rickster我已经将CPU繁重的工作交给了一个单独的线程,而且'EAGLContext'也有它自己的线程(让他们正常工作是件痛苦的事情,但他们确实如此)。 结果不会导致应用程序崩溃,并且不会一直抛出警告(尽管我注意到它在XCode中禁用OGL断点时不会发出警告) –

回答

-1

OpenGL不支持(或者至少在非常有限的情况下支持它,而不是在渲染部分)多线程。

它根本不支持它。

我不知道你的特定用法或iphone的实现,但库本身不支持它。

试着在这里看到。

http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

如果你想要去的多线程,在我的经验,就是有一个单独的线程处理OpenGL库/渲染和专业在不同的范围更多的线程(寻路,AI,碰撞检测的一个,你的名字)。

我希望这有助于。

干杯 莫里吉奥

+0

请参阅[Apple的编程指南](https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ConcurrencyandOpenGLES/ConcurrencyandOpenGLES.html#//apple_ref/doc/uid/TP40008793-CH409-SW2)了解如何使用OpenGL ES进行多线程处理适用于iOS。 – rickster