метод destroyFramebuffer в приложении openGL - PullRequest
1 голос
/ 14 октября 2010

в моем приложении для iPhone типа OpenGL, у меня есть этот метод ниже в реализации GLView.

Я заметил, что каждый раз, когда я запускал приложение во время разработки, последний кадр, который присутствовал, когда я закрывал приложение в последний раз, сначала рисовал, прежде чем приложение запустило свою анимацию ...

но когда я закомментировал этот метод, приложение запустилось бы просто отлично без старого конечного фрейма с прошлого раза.

так что у меня здесь что-то не так. возможно прямо в этом методе ... есть идеи?

(теперь я получаю пустой белый экран (как первый кадр) как раз перед анимацией, так что здесь что-то не так)

//------------------------------------------------------------------------------------
- (void)destroyFramebuffer 
{
NSLog(@"destroyFramebuffer");
    glDeleteFramebuffersOES(1, &viewFramebuffer);
    viewFramebuffer = 0;
    glDeleteRenderbuffersOES(1, &viewRenderbuffer);
    viewRenderbuffer = 0;

    if(depthRenderbuffer) 
    {
        glDeleteRenderbuffersOES(1, &depthRenderbuffer);
        depthRenderbuffer = 0;
    }
}

здесь ниже показано, как выглядит метод createFrameBuffer (способ запуска реализации GLView был с этими тремя строками):

    [EAGLContext setCurrentContext:context];
//    [self destroyFramebuffer];
    [self createFramebuffer];



//------------------------------------------------------------------------------------
- (BOOL)createFramebuffer 
{
NSLog(@"createFramebuffer");
    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    if (USE_DEPTH_BUFFER) 
    {
        glGenRenderbuffersOES(1, &depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }

    return YES;
}

1 Ответ

0 голосов
/ 22 января 2011

Когда вы уничтожаете свой буфер рендеринга, память восстанавливается.Шансы на повторное использование той же памяти в следующий раз довольно высоки, но не всегда гарантированы.Вам просто нужно очистить буфер при создании: (или, по крайней мере, визуализировать что-то, что заполняет буфер)

glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);

Также стоит изменить ваш метод уничтожения, чтобы проверить, что ваш фреймбуфер и рендербуффер вообще существуют, иначепопросите GL удалить вещи, которые вы не сделали.Например:

if (viewFramebuffer) {
    glDeleteFramebuffers(1, &viewFramebuffer), viewFramebuffer = 0;
}
if (viewRenderbuffer) {
    glDeleteRenderbuffers(1, &viewRenderbuffer), viewRenderbuffer = 0;
}
...