2014-09-28 129 views
1

我有一个EXC_BAD_ACCESS这段代码的最后一行(此代码被触发每秒几次),但我想不出是什么问题:EXC_BAD_ACCESS与glTexImage2D在GLKViewController

[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,因为它是这里自动化的东西之一。 它不会在第一帧时崩溃,而会在几十帧后崩溃。

任何人都可以发现问题吗?

UPDATE:

这似乎是因为对_outputFrame的竞争条件,它正在同时通过glTexImage2D读取更新。我会尝试锁定它进行阅读,然后回报。

+0

如果您可以发布您的解决方案,如果他们有类似的问题,那么其他人可以从中受益。 – Unheilig 2014-09-28 09:42:53

+0

我发布了它,但不知道它是否对任何人都有用,因为它是非常具体的... – aledalgrande 2014-09-28 19:02:44

回答

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]; 
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; 
+0

我编辑了你的文章和语法。感谢您的反馈,但我不知道为什么您建议不使用多线程时,它实际上取决于案件,而且我使用自定义着色器,而不是GLKBaseEffect。 – aledalgrande 2014-09-28 19:00:34