我知道在线程之间共享单个上下文是坏消息。我知道当主线程上的GL没有发生任何事情时,我可以在辅助线程上安全地创建和使用带有屏幕外帧缓冲的上下文。
我还没有找到一个明确的答案,我是否可以安全地在两个不同的线程上创建两个上下文(例如,绘制到屏幕的主线程,以及执行屏幕外绘图工作的辅助线程)并让他们同时进行GL函数调用。
换句话说,只要上下文不同,两个线程可以“共享”C API,从而“共享”GPU吗?或者这本身就是不可分享的东西?或者这是特定于实现的?
在iOS上专门询问OpenGL ES,但这可能是一个普遍的GL问题。
答案 0 :(得分:9)
是的,您需要为要使用OpenGL的每个线程使用一个上下文,也可以在上下文之间共享对象。这是要走的路:)。
答案 1 :(得分:1)
选项1 :如果您不同时使用两个线程的上下文,则一个上下文就足够了。
选项2 :如果您需要同时使用多个线程的OpenGL,则需要多个上下文。然后,如果上下文共享他们的 Sharegroup ,他们会像纹理一样分享他们的OpenGL内容。这样,您可以在后台线程上加载纹理或执行繁重的帧缓冲处理。
在这里查看关于Sharegroups的最后一节:http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html
选项3 :GLKit提供了一些内置的后台处理功能,例如通过GLKTextureLoader
s - textureWithContentsOfFile
加载异步纹理。我不知道所有的选项,但它肯定简化了异步OpenGL的一些使用案例。