我正在编写一个iPhone应用程序,它使用CaeaGlayer作为其图层使用UIView。一切都很好,除了1个小问题之外,有时它会崩溃exc_bad_access和以下堆栈跟踪:

    [EAGLView draw]
    glDrawArrays_Exec
    PrepareToDraw
    DrawFramebufferMakeResident
    AttachmentMakeResident
    TextureMakeResident
    memmove
.

它在线上崩溃:

    glVertexPointer(3, GL_FLOAT, 0, vertexCoordinates);
    glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates);
    glBindTexture(GL_TEXTURE_2D, textures[kActiveSideLeft]);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, totalPoints); //<--Crash here
.

应用程序只会在接口旋转变化期间崩溃(也恰好是视图帧更改时的唯一情况)。它不会经常崩溃;大多数时间需要3-5分钟的旋转装置来重现这个问题。
我相信我犯了一个与caeagllayer初始化/框架变化有关的错误,因为它崩溃的地方(我相信)。
所以这里是init和layout子视图方法:
init:

    ...
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;     
    eaglLayer.opaque = TRUE;

    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
    if (!context || ![EAGLContext setCurrentContext:context])
    {
        [self release];
        return nil;
    }

    glGenFramebuffersOES(1, &defaultFramebuffer);
    glGenRenderbuffersOES(1, &colorRenderbuffer);
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    ...
.

在设置框架上我只设置gl_modelview和gl_poemple矩阵,所以我猜没有什么不好的情况。
layoutsubviews:

    - (void)layoutSubviews
    {
      [EAGLContext setCurrentContext:context];

        glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
        [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
        glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
        glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);

        NSAssert1(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) == GL_FRAMEBUFFER_COMPLETE_OES, @"Failed to make complete framebuffer object: %X", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
    }
.

绘制方法本身看起来如:

        if ([EAGLContext currentContext] != context) {
            [EAGLContext setCurrentContext:context];
        }

        glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
        glViewport(0, 0, backingWidth, backingHeight);

        ...//drawing different triangle strips here

        glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
        [context presentRenderbuffer:GL_RENDERBUFFER_OES];
.

我会感谢上市代码或建议关于如何了解此错误的原因。

有帮助吗?

解决方案

我会怀疑是传递给rainArrays的totalPoints变量,或者如果这些阵列不是静态的,则可能是顶部的顶点或TextureCoordinates的值。您的崩溃意味着您在绘制阵列时,您就会走出内存结束。我对你的gl设置不那么怀疑,更关心你的内存管理,以及在旋转过程中抽签的内容。

(也是,fwiw,我不认为每次绑定渲染缓冲区时都应该调用RenderBufferStorage。当您创建它们时,您只需执行此操作。就是说,我不确定当您更改其大小时,您实际上不应该销毁缓冲区,并且只需从头开始重新创建它们。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top