2017-11-21 11 views
0

私が書いたことのないライブラリを維持するよう依頼されています。私は多くの異なる見解をしているアプリケーションを持っています。彼らはさまざまなサイズ(幅/高さ)である可能性があり、異なるシーンの可能性があり、確かに異なる視点です。通常、コードは次のようになります。OpenGLよりメモリリークが多く、割り当てよりも削除されています

initialize view 
set resolution of view 
do stuff to view 
clear view 

これは、1回のプロセスで複数回繰り返されます。

Windowsタスクマネージャーには、メモリリークがあることが示されています。このアプリケーションは、レンダリングと呼ばれるC++オブジェクトを呼び出すCレイヤーの周りに設計されています。 **のコードはCのレイヤーを表します。他のすべてはオブジェクト内にあります。

新しいビューを初期化するには、ビューの

**if there is an old render delete it.** 
{ 
    glDeleteVertexArrays(1, &this->vao); 

    glDeleteBuffers(1, &this->positionBuffer); 
    glDeleteBuffers(1, &this->fbo); 
    glDeleteBuffers(1, &this->rbo); 
    glDeleteBuffers(1, &this->ibo); 
    glDeleteBuffers(1, &this->dbo);  
}  

**Create new render** 
this->rbo = NULL; 
this->fbo = NULL; 
this->ibo = NULL; 
this->dbo = NULL; 
initialize this render's scalars. 

セット解像度のようなものが

glDeleteBuffers(1, &this->rbo); 
glDeleteBuffers(1, &this->fbo); 
glDeleteBuffers(1, &this->dbo); 

glGenRenderbuffers(1, &this->rbo); 
glBindRenderbuffer(GL_RENDERBUFFER, this->rbo); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, width, height); 
glBindRenderbuffer(GL_RENDERBUFFER, 0); 
error check 

glGenRenderbuffers(1, &this->dbo); 
glBindRenderbuffer(GL_RENDERBUFFER, this->dbo); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, width, height); 
glBindRenderbuffer(GL_RENDERBUFFER, 0); 
error check 

glGenFramebuffers(1, &this->fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, this->fbo); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, this->rbo); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this->dbo); 
error check 

を行く見て、

glDeleteVertexArrays(1, &this->vao); 

glDeleteBuffers(1, &this->positionBuffer); 
glDeleteBuffers(1, &this->fbo); 
glDeleteBuffers(1, &this->rbo); 
glDeleteBuffers(1, &this->ibo); 
glDeleteBuffers(1, &this->dbo); 

読書はこれがに最適な方法ではないであることを示唆しているようにクリアな視界が見えますGPUを使用しますが、コードを見ると、それはうまくいくはずです。彼らは永続的でした:)私はメモリがビューの設定解像度で割り当てられているのを見ますが、そのメモリはリリースされたように見えます。それが事実なら....なぜ漏れ?私は明白な何かを見落としていますか?

私は同様の言い方をした質問を読みましたが、答えはありません。ここでの割り当てよりはるかに多くの削除があります。

+0

OpenGLデバッガ(codeXL、nsight)を添付して、実際にすべてのOpenGLオブジェクトが解放されているかどうか確認しましたか? – BDL

答えて

0

BDLのコメントに追加するには、GLInterceptを試して、削除が適切に行われていることを検証することもできます。この素晴らしいツールは、OpenGLのすべての呼び出しをキャプチャし、コアOpenGLプロファイルを使用していなくても機能します。

しかし、あなたはタスクマネージャの犠牲者かもしれません。これから取得するarticle on CodeProject

まず、メモリリークがあることを確認します。多くの開発者は、Windowsタスクマネージャを使用してアプリケーションにメモリリークがないかどうかを確認します。タスクマネージャを使用するだけでなく、誤解を招くだけでなく、メモリリークがどこにあるかについて多くの情報を提供しません。

まず、タスクマネージャのメモリ情報がどのように誤解を招くかを理解しようとします。タスクマネージャには、実際に使用されているメモリではなく、ワーキングセットのメモリが表示されます。それはどういう意味ですか?このメモリは割り当てられたメモリであり、使用されるメモリではありません。さらに、ワーキングセットからのいくつかのメモリは、他のプロセス/アプリケーションによって共有することができます。

実際に漏れがあることを確認してください。次に、あなたのアプリでOpenGL呼び出しを調べることをお勧めします。

関連する問題