EXC_BAD_ACCESS与glTexImage2D在GLKViewController(EXC_

2019-10-21 01:29发布

我有一个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 。 我会尝试将其锁定为读,然后汇报。

Answer 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];


Answer 2:

几天后我就想通了一些这样的问题。

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;


文章来源: EXC_BAD_ACCESS with glTexImage2D in GLKViewController