在不同的ViewControllers / EAGLViews中使用相同的EAGLContext

时间:2011-10-04 09:59:36

标签: iphone objective-c opengl-es eaglview eaglcontext

我在EAGLContext之间使用相同的EAGLViews时遇到了一些问题。我有两个视图控制器,每个都有一个EAGLView

每个View Controller分配一个新的EAGLContext,并为每个相应的EAGLView创建一个后续的framebuffer / colorbuffer,但这会浪费内存资源。

我知道只需将不同的framebuffers / colorbuffers绑定到不同的EAGLContext,就可以在ViewControllers中使用相同的EAGLViews

Using Multiple OpenGL Views And UIKit

但到目前为止我还没有达到目的。

有什么想法吗?

提前致谢。

2 个答案:

答案 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相同的类,它们倾向于将它们放入他们的示例文件中。因此,就具体修改提出建议相对困难。

我最初的解决方案是创建一个单独的类,它可以出现一个共享的EAGLContextEAGLContext一次只能在一个线程上使用,所以这不一定是一个完整的解决方案,但你想要做的确切取决于你的程序的语义,感觉就像你的实际问题不同的主题

Xcode 4.1'OpenGL ES Application'模板在视图之外创建了上下文,而我认为它以前是在内部,这使得事情变得更容易。