我在EAGLContext
之间使用相同的EAGLViews
时遇到了一些问题。我有两个视图控制器,每个都有一个EAGLView
。
每个View Controller分配一个新的EAGLContext
,并为每个相应的EAGLView
创建一个后续的framebuffer / colorbuffer,但这会浪费内存资源。
我知道只需将不同的framebuffers / colorbuffers绑定到不同的EAGLContext
,就可以在ViewControllers中使用相同的EAGLViews
:
Using Multiple OpenGL Views And UIKit
但到目前为止我还没有达到目的。
有什么想法吗?
提前致谢。
答案 0 :(得分:1)
终于成功解决了问题。
在我使用的其中一个视图控制器中:
dispatch_async(openGLESContextQueue, ^{
[(EAGLView *)self.view setFramebuffer];
(...opengl draw code...)
[(EAGLView *)self.view presentFramebuffer];
});
在多线程环境中使用EAGLContext时,必须小心防止其他线程同时使用:
@syncronized(context) { ...opengl drawing here...}
并在将控制传递给另一个ViewController(通过presentViewController :)之前耗尽当前的dispatch_queue,使用:
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);
瞧!
谢谢:)
答案 1 :(得分:0)
EAGLView
实际上不是一个单独的类;它是一系列与Apple相同的类,它们倾向于将它们放入他们的示例文件中。因此,就具体修改提出建议相对困难。
我最初的解决方案是创建一个单独的类,它可以出现一个共享的EAGLContext
。 EAGLContext
一次只能在一个线程上使用,所以这不一定是一个完整的解决方案,但你想要做的确切取决于你的程序的语义,感觉就像你的实际问题不同的主题
Xcode 4.1'OpenGL ES Application'模板在视图之外创建了上下文,而我认为它以前是在内部,这使得事情变得更容易。