GLKViewController中的glTexImage2D EXC_BAD_ACCESS

时间:2014-09-28 06:26:36

标签: ios opengl-es glkit

我在这段代码的最后一行有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读取时正在更新。我会尝试锁定它以供阅读,然后报告回来。

2 个答案:

答案 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;