我在这段代码的最后一行有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通道矩阵。我在GLKViewController的drawRect
方法内。我认为我不应该绑定framebuffer,因为它是这里自动化的东西之一。 它不会在第一帧崩溃,而是在几十帧后崩溃。
有人能发现问题吗?
更新
似乎是因为_outputFrame
上的竞争条件,它在被glTexImage2D
读取时正在更新。我会尝试锁定它以供阅读,然后报告回来。
答案 0 :(得分:1)
这确实是解决方案(参见 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}}
答案 1 :(得分:0)
几天后我才发现这样的问题。
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;