문제

iPhone 응용 프로그램을 CaeAghieer와 함께 레이어로 사용하는 iPhone 응용 프로그램을 작성합니다. 모든 것은 괜찮아지며 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 subviews 메소드가 있습니다. 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_pojection 매트릭스 만 설정하므로 나쁜 일이 일어날 수있는 일은 아무것도 일어날 수 없을 것입니다.
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];
.

이 버그의 원인을 어떻게 찾을 수 있는지 나열된 코드 또는 제안에 대한 의견을 알아 보겠습니다.

도움이 되었습니까?

해결책

DrawArrays에 전달되는 totalPoints 변수가 의심 스럽거나 배열이 정적이 아닌 경우 vertexcorrdinates 또는 TextureCoordinates 값에 대해 의심 스러울 것입니다.충돌은 배열을 그리는 동안 메모리 끝을 숨기고 있음을 의미합니다.나는 귀하의 GL 설정에 대해 덜 의심스럽고 메모리 관리에 대해 더 관련이 있으며 회전 중에 다른 도면을 보여줍니다.

(또한 렌더링 버퍼를 바인딩 할 때마다 RenderBufferStorage를 호출해야한다고 생각하지 않아도됩니다. 그 (것)들을 생성 할 때만 한 번만 할 필요가있을 필요가있다.크기를 변경할 때 실제로 버퍼를 파괴해서는 안됩니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top