1

在我的 OpenGL 类型的 iphone 应用程序中,我在 GLView 实现下面有这个方法。

我注意到每次我在开发过程中启动应用程序时,我最后一次关闭应用程序时出现的最后一帧会在应用程序开始动画之前先绘制......

但是当我注释掉这个方法时,应用程序会在没有上次的旧结束帧的情况下正常启动。

所以我这里有问题。可能直接用这种方法......有什么想法吗?

(现在我在动画之前得到一个空白的白色屏幕(作为第一帧),所以这里有些不对劲)

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

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

下面是“createFrameBuffer”方法的外观(GLView 实现的启动方式是这 3 行):

    [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;
}
4

1 回答 1

0

当您销毁渲染缓冲区时,内存将被回收。下次再次使用相同内存的机会非常高,但并不总是保证。您只需要在创建时清除缓冲区:(或至少渲染填充缓冲区的内容)

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;
}
于 2011-01-22T02:54:00.597 回答