OpenGLES无法在iPhone线程中生成Framebuffers

时间:2010-07-22 15:04:01

标签: iphone objective-c multithreading opengl-es nsthread

我有一个可爱的OpenGLES代码片,可以为我渲染图像。当我想,我可以调用它上面的函数:

-(UIImage *)renderToImage;

这会进行很多渲染工作并返回一个图像。这包括生成FBO,纹理等。

最近,我发现自己需要加强这一点。图像生成需要四秒钟,因此我想将工作转移到另一个线程并让应用继续。这似乎很简单。我用这段代码制作了一个方法:

-(void) generateRandomNewImage:(MyViewController *)evc{
UIImage * renderedImage = [self renderToImage];
NSString * fileLoc = [self writeToTempFile:renderedImage];
NSLog(@"File location:%@",fileLoc);
[evc performSelectorOnMainThread:@selector(imageGenerationComplete:) withObject:fileLoc waitUntilDone:NO];
}

希望你能看到这里的逻辑。此方法呈现图像,将其保存到文件系统,并在主线程的viewcontroller上调用方法,让它知道文件已准备好。这段代码在我的opengl渲染器中。它在这里被称为主线程的viewcontroller:

thread = [[NSThread alloc] initWithTarget:renderer 
                           selector:@selector(generateRandomNewImage:) 
                           object:self];
[thread start];

对我来说,这似乎也很好。当我运行此代码时,我在控制台中被告知我的framebuffer对象状态是错误的,状态为零。我不知道为什么。结果,我得到一个空白图像(保存到临时文件工作,顺便说一下,我已经测试过了)。

为了测试,我将所有这些代码放入主线程中,没有创建任何新线程或任何东西。一切都很好。一旦我尝试将图像生成传递给另一个线程,我就遇到了问题。

1 个答案:

答案 0 :(得分:2)

在另一个线程中使用OpenGL并不是那么简单,只有一个线程一次可以使用OpenGL上下文,而第二个线程没有OpenGL上下文,因此所有OpenGL调用都会失败。

解决方案:为第二个线程创建另一个OpenGL上下文,并阅读this