【问题标题】:I think this open gl code is causing a memory leak, What mistake am I making? [closed]我认为这个开放的 gl 代码导致内存泄漏,我犯了什么错误? [关闭]
【发布时间】:2021-06-23 23:45:51
【问题描述】:

在这段代码中,我尝试画两条线,最初它基本上是 VBO 和 VAO 的简短设置,然后我画线,它似乎可以工作,但是当我复制并粘贴代码几次以获得更多行我似乎正在造成内存泄漏,因此一定是做错了。

我觉得有更好的方法可以做到这一点,例如在其他地方的初始化函数中创建一个仅运行一次的 VAO 并重用它删除我的缓冲区对象,所以我只是绑定 VAO 并在我的绘图中绘制或其他东西功能。所以我首先尝试在这个函数中完成这一切no bound VAO ...我知道销毁不同数据类型的规则有点复杂,也许我不清楚。

它画得很好,但正如我所说的,内存一直在以每秒 1 兆字节的速度增长。这似乎在运行大约一分钟后发生。

        void drawMenu(){
    vec3 start(-3,-.8,0);
    vec3 end(3,-.8,0);
    startPoint = start;
    endPoint = end;
    GLfloat colorToSet[4]= {1.0f,1.0f,1.0f,1.0f};
    
    verticesl = {
    start.x, start.y, start.z,
    end.x, end.y, end.z,
    };
        
            
    glUseProgram(shaderProgram);
        
    GLuint uniformLocation = glGetUniformLocation(shaderProgram,"uniformColor");
    if (uniformLocation<0){
    cout<< "drawline function can't find a uniform location in your fragment shader "<< endl;
        }
    else glUniform4f(uniformLocation, colorToSet[0],colorToSet[1],colorToSet[2],colorToSet[3]);
    
    glGenBuffers(1, &VBO);
     
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticesl), verticesl.data(), GL_STATIC_DRAW);
    glGenVertexArrays(1, &VAO);// can creat the VAO now to store the VBO in
            
    glBindVertexArray(VAO);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
          
          
            
    glLineWidth(4.0f);
            
    glDrawArrays(GL_LINES, 0, 2);
    glDeleteBuffers(1,&VBO);
        
    GLfloat colorToSet1[4]= {1.0f,1.0f,1.0f,1.0f};
         
    
    start = vec3(-3,-.9,0);
    end = vec3(3,-.9,0);
    glUniform4f(uniformLocation, colorToSet1[0],colorToSet1[1],colorToSet1[2],colorToSet1[3]);
            
    verticesl = {
    start.x, start.y, start.z,
    end.x, end.y, end.z,
    
    };
           
    glGenBuffers(1, &VBO);
      
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticesl), verticesl.data(), GL_STATIC_DRAW);//fills the previously bound vbo
           
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    
    glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind the buffer
          
          
             
    glLineWidth(4.0f);
             
    glDrawArrays(GL_LINES, 0, 2);
            
    glDeleteBuffers(1,&VBO);
              
               
          
           
} 

【问题讨论】:

  • Sm1 否决了我的问题,并给出以下说明:无用或明确 - 没有显示研究,但它清楚地表明我有内存泄漏,如果他们做了任何他们会知道的研究这是一个需要解决的坏问题,问题出在我发布的有用的短代码中。还编辑了我的问题以删除我说可能有更好的方法可以做到这一点,并且擅长它的人可能会向我展示,并且我花了几天时间研究它,我已经在其上构建了一个游戏引擎,还没有研究我问。再加上小编也答不上来,只是玩弄而已。
  • 所以我很清楚,有些人也有很大的权力去评判其他人,他们甚至在手头的主题上都不在同一个联盟中。可能有 2 个相关问题,我通过大量研究怀疑内存泄漏和代码组织。我之前没有问过,因为我知道在这里得到帮助是什么感觉,但情况越来越糟。这就是为什么我读了好几天,Open gl 是出了名的困难,如果其他人做了他们的研究,他们会更有帮助,也不那么挑剔。如果您不知道答案,我不会只编辑我的问题。
  • 您永远不会删除 VAO。还不清楚您的变量是什么类型,尤其是vertices1。你必须提供一个 MRE,好像现在很难甚至不可能尝试你的代码。

标签: c++ opengl vbo vao


【解决方案1】:

您正在渲染函数中执行glGenBuffersglBufferData,这将分配GPU 内存并在每一帧加载它。相反,请在程序的设置部分使用glGenBuffers。很可能您只是更改为大多数渲染(网格、地形等)提供给着色器的转换,因此您只需在设置中调用一次glBufferData。如果您确实每帧都在更改顶点数据(动态文本?动画构造的网格?),那么您需要在定义缓冲区时使用GL_DYNAMIC_DRAW,然后您可以谨慎地在渲染函数中使用glBufferData

【讨论】:

  • 他还删除了渲染循环中的缓冲区。这是低效的,但如果操作正确不会导致内存泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多