我有一个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);
当调试我确保纹理被创建(id为> 0),输出帧具有一个有效的指针的数据,是一个4信道矩阵。 我是里面drawRect
一个GLKViewController的方法。 我想我不应该帧缓存绑定,因为它们是在这里自动化的事情之一。 它不会在第一帧崩溃,但有几个几十个帧之后。
任何人能发现这个问题?
更新:
现在看来,这是因为在竞争条件_outputFrame
,它正在同时通过读取更新glTexImage2D
。 我会尝试将其锁定为读,然后汇报。
这是该解决方案确实(见UPDATE),我有固定它NSLock
。 首先,我换了实例变量_outputFrame
一个临时一个会从另一个线程更新,并使用锁来更新实例变量:
[_frameLock lock];
_outputFrame = temp;
[_frameLock unlock];
然后用锁,当我想从实例变量如下:
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
我的解决方案:
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;