我看过很多关于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 ....
}
我错过了什么 ??
我发现如果我在主线程中生成和设置对象,我仍然可以在第二个线程中绑定和修改对象的数据,并在主线程中正确渲染。