我在EAGLViews上使用相同的EAGLContext时遇到了一些问题。我有两个视图控制器,每个控制器都有一个EAGLView。
每个视图控制器分配一个新的EAGLContext,并为每个相应的EAGLView创建后续的帧缓冲区/颜色缓冲区,但这是对内存资源的浪费。
我知道,通过简单地将不同的帧缓冲区/颜色缓冲区绑定到不同的EAGLContext,可以跨ViewControllers使用相同的EAGLViews
Using Multiple OpenGL Views And UIKit
但到目前为止,我还没有做到这一点。
有什么想法吗?
提前谢谢。
发布于 2011-10-05 01:59:38
最终设法解决了这个问题。
在我使用的一个视图控制器中:
dispatch_async(openGLESContextQueue, ^{
[(EAGLView *)self.view setFramebuffer];
(...opengl draw code...)
[(EAGLView *)self.view presentFramebuffer];
});在多线程环境中使用EAGLContext时,必须小心防止其他线程同时访问它,方法是:
@syncronized(context) { ...opengl drawing here...}并在将控制传递给另一个dispatch_queue (通过presentViewController:)之前排出当前ViewController,使用:
dispatch_sync(openGLESContextQueue, ^{});因此,通过使用这两个技巧,我能够在多个视图中使用一个EAGLContext。还必须格外关注EAGLContext的当前状态。我得到了意想不到的结果,因为在第一个视图中,我有:
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);在第二个视图中,我有完全不同的绘图代码,当然,我忘记了使用:
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);瞧,瞧!
谢谢:)
发布于 2011-10-04 20:05:10
EAGLView实际上不是一个单独的类;它是一系列同名的类,苹果倾向于将其添加到示例文件中。因此,对具体的修改提出建议是相对困难的。
我最初的解决方案是创建一个单独的类,它提供一个单一的共享EAGLContext。EAGLContext一次只能在一个线程上使用,所以这不一定是一个完整的解决方案,但您到底想要做什么可能取决于您的程序的语义,感觉就像是一个与实际问题不同的主题。
Xcode4.1“OpenGL ES应用程序”模板在视图之外创建了上下文,而我之前认为它在视图内部,这使得事情变得更容易一些。
https://stackoverflow.com/questions/7646158
复制相似问题