0

プログラムで小さなメモリ リークが発生していることに気付き、ようやく問題を突き止めることができました。

私がやっていることは、この関数を呼び出して画面に 5 つの長方形を描画することです。

bool OpenGlEntity::fillRect(SDL_Rect rect, float R, float G, float B, float A){

glPushMatrix();

    glDisable(GL_TEXTURE_2D);

    GLfloat vertices_position[] = {
    (GLfloat)rect.x, (GLfloat)rect.y,
    (GLfloat)(rect.x+rect.w), (GLfloat)rect.y,
    (GLfloat)(rect.x+rect.w), (GLfloat)(rect.y+rect.h),
    (GLfloat)rect.x, (GLfloat)(rect.y+rect.h),
    };

    glTranslatef(0, 0, 0);
    //scale
    glScalef(1,1,1);
    //set color
    glColor4f(R, G, B, A);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, vertices_position);

    glLockArraysEXT(0, 4);

    glDrawArrays(GL_QUADS, 0, 4);

    glUnlockArraysEXT();

    glDisableClientState(GL_VERTEX_ARRAY);

    glEnable(GL_TEXTURE_2D);
    //reset color
    glColor4f(1.f, 1.f, 1.f, 1.f);

glPopMatrix();

return true;}

「glDisable(GL_TEXTURE_2D);」を実行しない場合 (または "glEnable(GL_TEXTURE_2D);") リークは発生しません。どうしてこれなの?

私にとってはあまり意味がありませんが、OpenGL レンダリングの経験はあまりありません。

4

1 に答える 1

0

特定の状態を有効または無効にすると、メモリの「リーク」が発生すると思われる多くの理由があります。たとえば、テクスチャでトリリニア フィルタリングを有効にしていて、テクスチャにミップマップ データがない場合、ドライバは、(実際のミップマップ レベルを生成するかどうかに関係なく) ミップマップ チェーン/ピラミッドにメモリを割り当ててしまうことがよくあります。テクスチャ フィルタの状態を変更しただけで、メモリ消費量が最大 33% 増加します。

ところで、ドローコールは実際にはメモリの増加の原因ではありません。通常、描画呼び出しは、ドライバーがキューに入れられたコマンドをコミットするポイントです。これが、glEnable (...) または glDisable (...) への呼び出しの期間を計り、その状態を変更するオーバーヘッドの測定値を取得できない理由です。スマート ドライバーは、最後の描画呼び出しと現在の描画呼び出しの間のすべての状態変更要求を実行します。これは、状態設定の大部分が実際に行われるときです。したがって、あなたの場合、テクスチャユニットやオブジェクトが初めてバインドされて有効になるまで、ドライバはいくつかのテクスチャ設定操作を延期している可能性があります。その結果、ドライバは、ドローコールを発行したときに実行する一連のタスクの実行中に、テクスチャにメモリを割り当ててしまいます。

glDraw (...) がボトルネックのように見えることを確認し、頂点にバインドされていると想定して、アプリケーションのプロファイルを作成したくなるかもしれませんが、多くの場合、これは真実から遠く離れることはできません :) これは多くの例の 1 つにすぎませんGPU を使用するアプリケーションを効果的にデバッグし、メモリ リソース割り当てを追跡し、プロファイリングするために、より専用のツールと API が必要な理由。

いずれにせよ、あなたが経験しているのは通常の動作である可能性が高く、ドライバーは「デバイスの紛失」などのイベントに対処するために複数の場所 (CPU、GPU など) にメモリを割り当てる必要があります。「リーク」が 1 回限りの発生である場合は、それを無視して、ドライバーのメモリ管理に任せることができます。

于 2013-07-29T18:01:29.920 に答える