首页 文章

GLKViewController中的glTexImage2D EXC_BAD_ACCESS

提问于
浏览
1

我在这段代码的最后一行有 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 回答

  • 1

    这确实是解决方案(见 UPDATE ),我用 NSLock 修复了它 . 首先,我将实例变量 _outputFrame 与从另一个线程更新的临时变量 _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;
    

相关问题