Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGLES无法在iPhone线程中生成帧缓冲区_Iphone_Objective C_Multithreading_Opengl Es_Nsthread - Fatal编程技术网

OpenGLES无法在iPhone线程中生成帧缓冲区

OpenGLES无法在iPhone线程中生成帧缓冲区,iphone,objective-c,multithreading,opengl-es,nsthread,Iphone,Objective C,Multithreading,Opengl Es,Nsthread,我有一个可爱的OpenGLES代码片段,可以为我渲染图像。如果需要,我可以在上面调用函数: -(UIImage *)renderToImage; 这会进行大量渲染工作,并返回图像。这包括FBO、纹理等的生成 最近,我发现自己需要加强这一点。图像生成需要四秒钟,所以我想把工作交给另一个线程,让应用程序继续。这似乎很简单。我用以下代码创建了一个方法: -(void) generateRandomNewImage:(MyViewController *)evc{ UIImage * rendered

我有一个可爱的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];
对我来说,这似乎也不错。当我运行这段代码时,控制台告诉我帧缓冲区对象状态出错,状态为零。我不知道为什么。结果,我得到一个空白图像(保存到临时文件工作,顺便说一下,我已经测试过它们)


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

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


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

如果您正在考虑在上下文之间共享状态,请阅读此内容。太棒了。这正是我所需要的/