c++ - 没有一个新的内存泄漏 1mb/s

标签 c++ opengl memory memory-leaks

我创建了一个“乒乓”着色器类,它在两个纹理之间渲染着色器。由于某种原因,该程序存在大量内存泄漏,我无法找到它。我在显示函数中没有使用任何新语句。代码如下所示:

显示功能:

void display()
{
    r->Render();
    glutSwapBuffers();
}

渲染:

void Effect2::Render()
{


    shader.Start(time);
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(-1.0f, -1.0f);

        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(1.0f, -1.0f);

        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(1.0f, 1.0f);

        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(-1.0f, 1.0f);

    }

    glEnd();
    shader.End();

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnable(GL_TEXTURE_2D);
    shader.BindCurrentTexture();
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(-1.0f, -1.0f);

        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(1.0f, -1.0f);

        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(1.0f, 1.0f);

        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(-1.0f, 1.0f);

    }
    glEnd();
    glDisable(GL_TEXTURE_2D);
    Renderer::Render();
}

着色器开始、结束、绑定(bind)纹理:

void PingPongShader::Start(float time)
{

    if(!began)
    {

        //buffer
        glGenFramebuffers(1, &frameBuffer);
        GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENT0};
        glDrawBuffers(1, drawBuffers);

        glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[current], 0);
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, textures[abs(current-1)]);
        glUseProgram(shader);
        if(paramCallback != NULL)
            paramCallback(shader);
        //internal shader vars
        glUniform2f(screenSizeLoc, (float)width, (float)height);
        if(drawingRadius > 0)
        {
            glUniform1f(dr_radius, drawingRadius);
            glUniform4f(dr_color, drawingColor[0], drawingColor[1], drawingColor[2], drawingColor[3]);
            glUniform2f(dr_pos, drawingPos[0], drawingPos[1]);
        }
        else
        {
            glUniform1f(dr_radius, -1.0);
        }

        glUniform1f(timeLoc, time);
        began = true;

    }
    else
    {
        printf("Could not call Start(). Did you forget to call End() ?");
    }

}
void PingPongShader::End()
{
    if(began)
    {

        glUseProgram(0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glDisable(GL_TEXTURE_2D);
        current = abs(current-1);
        began = false;


    }
    else
    {
        printf("Could not call End(). Did you forget to call Start() ?");
    }
}
void PingPongShader::BindCurrentTexture()
{
    glBindTexture(GL_TEXTURE_2D, textures[skip ? abs(current-1) : current]);
}

除了内存泄漏之外,输出正是我所期望的。

有什么想法吗?

最佳答案

您在每个 Start() 中调用 glGenFramebuffers,从而在每个帧中分配一个缓冲区对象。


旁注:在 0 和 1 之间交替时,1 - currentabs(current - 1) 更有效(而且我想说更惯用)。

关于c++ - 没有一个新的内存泄漏 1mb/s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21889240/

相关文章:

c++ - 蒙提霍尔程序 C++

c++ - C++中双默认构造函数分配的值

OpenGL 我什么时候可以再次开始发出命令

c++ - 从内存中获取文件句柄

javascript - JavaScript 数组的内存存储

performance - Delphi - 内存使用情况并将类作为 Var 参数传递

c++ - IIS-部署ASP.NET网站和数据库连接

c++ - 模板模板 C++ 函数

c++ - 打开 GL : is this the right way of using VBO IBO and VAO

linux - 我可以强制编译器将我的共享库也放入二进制文件中吗?