微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我认为这个开放的 gl 代码导致了内存泄漏,我犯了什么错误?

如何解决我认为这个开放的 gl 代码导致了内存泄漏,我犯了什么错误?

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

我觉得有一种更好的方法可以做到这一点,例如在其他地方的初始化函数中创建一个 VAO,该函数只运行一次并重用它删除我的缓冲区对象,所以我只是绑定 VAO 并绘制或绘制中的其他内容功能。所以我试图在这函数中首先用 if x = 0 做这一切,使 VBO 和 VBO 等。然后 x=1 所以它只运行一次以创建缓冲区对象等。但后来我得到了错误,没有任何迹象表明有没有绑定 VAO ... 我知道销毁不同数据类型的规则有点复杂,可能我不太清楚。

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

        void drawMenu(){
    vec3 start(-3,-.8,0);
    vec3 end(3,0);
    startPoint = start;
    endPoint = end;
    GLfloat colorToSet[4]= {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,2);
    glDeleteBuffers(1,&VBO);
        
    GLfloat colorToSet1[4]= {1.0f,1.0f};
         
    
    start = vec3(-3,-.9,0);
    end = vec3(3,0);
    gluniform4f(uniformlocation,colorToSet1[0],colorToSet1[1],colorToSet1[2],colorToSet1[3]);
            
    verticesl = {
    start.x,};
           
    glGenBuffers(1,&VBO);
      
    glBindBuffer(GL_ARRAY_BUFFER,GL_STATIC_DRAW);//fills the prevIoUsly bound vbo
           
    glGenVertexArrays(1,&VAO);
    glBindVertexArray(VAO);
    glEnabLevertexAttribArray(0);
    glVertexAttribPointer(0,0); //unbind the buffer
          
          
             
    gllinewidth(4.0f);
             
    glDrawArrays(GL_LInes,2);
            
    glDeleteBuffers(1,&VBO);
              
               
          
           
} 

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。