【问题标题】:OpenGLES fails to generate Framebuffers in iPhone threadOpenGLES 无法在 iPhone 线程中生成帧缓冲区
【发布时间】:2010-07-22 23:29:03
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多