在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;