0

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

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

我知道可以EAGLContext通过简单地将不同的帧缓冲区/颜色缓冲区绑定到不同的视图控制器来使用相同的EAGLViews

使用多个 OpenGL 视图和 UIKit

但到目前为止我还没有做到这一点。

有任何想法吗?

提前致谢。

4

2 回答 2

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);

瞧!

谢谢 :)

于 2011-10-04T17:59:38.383 回答
0

EAGLView实际上不是一个类;它是一系列具有相同名称的类,Apple 倾向于将其放入其示例文件中。因此,就具体修改提出建议相对困难。

我最初的解决方案是创建一个单例类来销售单个共享的EAGLContext. EAGLContexts 一次只能在一个线程上使用,因此这不一定是一个完整的解决方案,但您想要做什么可能取决于您的程序的语义,并且感觉就像与您的实际问题不同的主题。

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

于 2011-10-04T12:05:09.770 回答