我在这段代码的最后一行有 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,因为它是这里自动化的东西之一 . It doesn't crash at the first frame, but a few dozens frames later.
有人能发现问题吗?
UPDATE:
这似乎是因为 _outputFrame
上的竞争条件,它在被 glTexImage2D
读取时被更新 . 我会尝试锁定它以供阅读,然后报告回来 .
2 回答
这确实是解决方案(见 UPDATE ),我用
NSLock
修复了它 . 首先,我将实例变量_outputFrame
与从另一个线程更新的临时变量_outputFrame
交换,并使用锁来更新实例变量:然后在我想从实例变量中读取时使用锁:
几天后我才发现这样的问题 .
我的解决方案