0

我有一个可爱的 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];
}

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

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

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

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

4

1 回答 1

2

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

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

于 2010-07-22T15:21:39.743 回答