2017-01-02 10 views
0

memoryC++とOpenGLで非常にゆっくりとメモリを増やしてリセットしますか? (VSデバッガ)

私のC++プログラムのメモリは非常にゆっくりと増加し、一定のポイント(60MB)に達してからしばらくしてから約12MB減少します。私のプログラムが実行されている間、これは無期限に繰り返されます。これは、それ自体問題ですか?

私は、フレームあたりの時間が高速なメモリの増加を行い、まだ60メガバイトに達した後、再び減少にそれを呼び出すように、フレームごとに何度も呼び出しています。このOpenGLの関連機能に関連すると思われます。もしこの問題をチェックしながら一度に最大10分間、メモリをゆっくりと60MB以上にすると、十分な時間が与えられれば、私は確信しています。

// vertices is just a GLfloat[] and the only other part of the function 

glBindVertexArray(this->vao); 

glBindBuffer(GL_ARRAY_BUFFER, this->vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); // i believe it is this line 

glBindVertexArray(0); 
+0

私には、ガベージコレクションの動作のように見えます。これは完全に有効なメモリ管理戦略です。 – datenwolf

答えて

3

glBufferDataは()実際に操作をキューに入れますし、最終的にフラッシュされます、ほとんどのドライバですぐにGPUにデータをアップロードしません。

これが機能するためには、それはデータがまだそのコマンドキューがフラッシュされた時点で周りのだろうかどうかを知る方法がないので、ドライバーがあなたの頂点のコピーを作成する必要があります。その向こう

、どのようなメモリ戦略はOpenGLドライバによって使用されると、そのメモリが再利用/リリースされる方法と時期を決定するので、あなたが見ている行動は必ずしも問題ではありませんでしょう。

これは、すべて私たちが頂点が割り当てられているかを確認することはできませんので、あなたは、あなたのコードで追加のメモリリークを持っていないと仮定しています。

+0

これはポインタではありません。 – Accumulator

+2

もちろんです。 glBufferData()は3番目の引数としてデータへのポインタをとります。実装がその違いを理解することができないので、スタックに生存するデータへのポインタを与えることは無関係です。それが実際にデータをコピーする必要がある理由です。私はあなたがヒープ割り当てメモリとポインタを混同していると思います。 – Frank

0

あなたは、すべての描画呼び出し時に頂点データを転送する必要はありません。 glBufferData()は、VBOに対して一度だけ呼び出される必要があります。後で、対応するVBOを、頂点配列または頂点属性にバインドしたいときにバインドするだけです。

関連する問題