在GLKViewController中使用glTexImage2D的EXC_BAD_ACCESS

我在这段代码的最后一行有一个EXC_BAD_ACCESS (这段代码每秒被触发几次),但我不知道是什么问题:

 [EAGLContext setCurrentContext:_context]; glActiveTexture(GL_TEXTURE0); glPixelStorei(GL_PACK_ALIGNMENT, 1); glBindTexture(GL_TEXTURE_2D, _backgroundTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _outputFrame.cols, _outputFrame.rows, 0, GL_BGRA, GL_UNSIGNED_BYTE, _outputFrame.data); 

当debugging时,我确定纹理被创build(id是> 0),输出帧有一个指向数据的有效指针,是一个4通道matrix。 我在GLKViewController的drawRect方法中。 我想我不应该绑定帧缓冲器,因为它是这里自动化的东西之一。 它在第一帧没有崩溃,但在几十帧之后。

有人可以发现问题吗?

更新:

看起来是因为_outputFrame上的竞争条件,它正在被glTexImage2D读取的同时被更新。 我会尝试locking它的阅读,然后报告。

这确实是解决scheme(请参阅更新 ),我用NSLock修复它。 首先,我将实例variables_outputFrame与一个从另一个线程更新的临时variables进行交换,并使用锁来更新实例variables:

 [_frameLock lock]; _outputFrame = temp; [_frameLock unlock]; 

然后,当我想从实例variables读取时使用锁:

 glActiveTexture(GL_TEXTURE0); glPixelStorei(GL_PACK_ALIGNMENT, 1); glBindTexture(GL_TEXTURE_2D, _backgroundTexture); [_frameLock lock]; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _outputFrame.cols, _outputFrame.rows, 0, GL_BGRA, GL_UNSIGNED_BYTE, _outputFrame.data); [_frameLock unlock]; 

几天后我才发现这样的问题。

 1. better avoid rendering in multi-thread 2. better render in GLKView with base affect, and don't manually manage framebuffer& render buffer by yourself 3. base effect render raw pixel data like this 

我的解决scheme

 glTexImage2D(...); self.baseEffect.texture2d0.envMode = GLKTextureEnvModeReplace; self.baseEffect.texture2d0.target = GLKTextureTarget2D; self.baseEffect.texture2d0.name = texture; self.baseEffect.texture2d0.enabled = YES; self.baseEffect.useConstantColor = YES;