首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同的视图控制器/EAGLView中使用相同的EAGLContext

在不同的视图控制器/EAGLView中使用相同的EAGLContext
EN

Stack Overflow用户
提问于 2011-10-04 17:59:36
回答 2查看 2.5K关注 0票数 0

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

每个视图控制器分配一个新的EAGLContext,并为每个相应的EAGLView创建后续的帧缓冲区/颜色缓冲区,但这是对内存资源的浪费。

我知道,通过简单地将不同的帧缓冲区/颜色缓冲区绑定到不同的EAGLContext,可以跨ViewControllers使用相同的EAGLViews

Using Multiple OpenGL Views And UIKit

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

有什么想法吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-05 01:59:38

最终设法解决了这个问题。

在我使用的一个视图控制器中:

代码语言:javascript
复制
dispatch_async(openGLESContextQueue, ^{

        [(EAGLView *)self.view setFramebuffer];

        (...opengl draw code...)

        [(EAGLView *)self.view presentFramebuffer];

    });

在多线程环境中使用EAGLContext时,必须小心防止其他线程同时访问它,方法是:

代码语言:javascript
复制
@syncronized(context) { ...opengl drawing here...}

并在将控制传递给另一个dispatch_queue (通过presentViewController:)之前排出当前ViewController,使用:

代码语言:javascript
复制
dispatch_sync(openGLESContextQueue, ^{});

因此,通过使用这两个技巧,我能够在多个视图中使用一个EAGLContext。还必须格外关注EAGLContext的当前状态。我得到了意想不到的结果,因为在第一个视图中,我有:

代码语言:javascript
复制
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);

在第二个视图中,我有完全不同的绘图代码,当然,我忘记了使用:

代码语言:javascript
复制
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

瞧,瞧!

谢谢:)

票数 1
EN

Stack Overflow用户

发布于 2011-10-04 20:05:10

EAGLView实际上不是一个单独的类;它是一系列同名的类,苹果倾向于将其添加到示例文件中。因此,对具体的修改提出建议是相对困难的。

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

Xcode4.1“OpenGL ES应用程序”模板在视图之外创建了上下文,而我之前认为它在视图内部,这使得事情变得更容易一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7646158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档