Question

Je suis en train d'écrire une application iPhone qui utilise UIView avec un CAEAGLayer que sa couche.Tout est beau et de travail en dehors de 1 petit problème:parfois il se bloque avec EXC_BAD_ACCESS et le suivant la trace de la pile:

    [EAGLView draw]
    glDrawArrays_Exec
    PrepareToDraw
    DrawFramebufferMakeResident
    AttachmentMakeResident
    TextureMakeResident
    memmove

il se bloque sur la ligne:

    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

L'Application ne crash lors de l'interface de modification de rotation (qui se trouve également être le seul cas où le point de vue image de changements).Il ne plante pas souvent;la plupart du temps, il prend de 3 à 5 minutes de la rotation de l'appareil pour reproduire ce problème.
Je crois que je suis en train de faire une erreur qui est liée à CAEAGLLayer initialisation / cadre de changement puisque c'est là que ça plante (je crois).
Voici donc l'initialisation et la mise en page des sous-vues méthodes:
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);
    ...

Sur l'ensemble cadre j'ai seulement mis GLMATRIXMODE et GL_POJECTION matrices, donc je suppose que rien de mauvais ne peut arriver là-bas.
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));
    }

La méthode de tirage en lui-même ressemble à:

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

Je te remercie de tout commentaire sur la liste de code ou des suggestions sur comment puis-je trouver la cause de ce bug.

Était-ce utile?

La solution

Je serais méfiant de l' totalPoints variable passée à drawArrays, ou peut-être vos valeurs pour vertexCorrdinates ou textureCoordinates, si ces tableaux ne sont pas statiques.Votre crash implique que vous êtes à pied à l'extrémité de la mémoire lors de la sélection des tableaux.Je suis moins suspect de votre programme d'installation de GL et de plus en plus inquiets au sujet de votre gestion de la mémoire, et ce que vous êtes dessin qui est différent au cours de la rotation.

(Aussi, FWIW, je ne pense pas que l'on devrait appeler RenderBufferStorage chaque fois que vous lier le tampon de rendu(s).Vous ne doivent faire qu'une seule fois lorsque vous les créez.Cela dit, je ne suis pas sûr que vous ne devriez pas réellement détruire la mémoire lorsque vous changez de leur taille et de leur juste à les recréer à partir de zéro.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top