共享两个上下文(sharegroup),只有主线程中生成的对象才有效....

时间:2012-05-24 10:32:38

标签: iphone opengl-es

我见过很多关于opengles(iOS)并发编程的文档,仍然无法解决我的问题,所以我在这里请求你的帮助。

我按照指令创建了两个线程,每个线程拥有一个上下文,并使它们成为相同的共享组,在主线程中呈现对象,并在第二个线程中创建对象。

我无法理解的是我无法渲染在第二个线程中创建的对象。 (如果我将对象创建代码移回主线程,则它可以工作。)

我在对象的设置序列之后做了glFlush()。我只是不明白。

我使用由XCode4生成的默认opengl演示应用程序。并添加这样的代码用于测试:

-(void)setupGL
{

    [EAGLContext setCurrentContext:self.context];
    self.context2 = [ [ EAGLContext alloc ] initWithAPI: kEAGLRenderingAPIOpenGLES2 sharegroup: self.context.sharegroup ];

    if( !self.context2 )
    {
        printf( " error !!!" );
    }
    if( self.context.sharegroup != self.context2.sharegroup )
    {
        printf( " error2 !!!" );
    }    

    ... self.effect = ....
    ... glEnable....
    ...

    [ self performSelectorInBackground: @selector(indicator) withObject: nil ];
}

-(void)indicator // run this in another thread
{
    [EAGLContext setCurrentContext:self.context2];

    glGenVertexArraysOES(1, &_vertexArray);
    glBindVertexArrayOES(_vertexArray);

    glGenBuffers(1, &_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer2);
    glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData2), gCubeVertexData2, GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(GLKVertexAttribNormal);
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

    glBindVertexArrayOES(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glFlush();
    [ EAGLContext setCurrentContext: nil ];
}

- (void)update
{
    .... generated by XCode4 ....
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    .... generated by XCode4 ....
}

我错过了什么?

我发现如果我在主线程中生成并设置对象,我仍然可以在第二个线程中绑定和修改对象的数据,并在主线程中正确呈现。

1 个答案:

答案 0 :(得分:1)

我认为这可能会回答你的问题:

Can Vertex Array Objects (VAOs) be shared across EAGLContexts in OpenGL ES?

大多数对象类型将在共享组中共享,但明确不支持VAO。