2016-09-16 7 views
-2

こんにちは私は最近win32/openglの学習を始めました。ウィンドウ内にマルチカラーキューブを表示する関数を書きました。私の問題はリソースリークがあることですが、私は困惑していて、削除することを忘れているのかどうかはわかりません。リソースリークopengl/win32

NOTE私はそれをしないでください。この機能

void display() 
{ 
    g.hglrc = wglCreateContext(g.hdc); 
    wglMakeCurrent(g.hdc, g.hglrc); 

    // make the color a white hue 
    glClearColor(1.0F, 1.0F, 1.0F, 1.0F); 

    // Clear screen and Z-buffer 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Reset transformations 
    glLoadIdentity(); 

    // Rotate when user changes rotate_x and rotate_y 
    glRotatef(rotate_x, 1.0, 0.0, 0.0); 
    glRotatef(rotate_y, 0.0, 1.0, 0.0); 

    //Multi-colored side - FRONT 
    glBegin(GL_POLYGON); 
    glColor3f(1.0, 0.0, 0.0);  glVertex3f(0.5, -0.5, -0.5);  // P1 is red 
    glColor3f(0.0, 1.0, 0.0);  glVertex3f(0.5, 0.5, -0.5);  // P2 is green 
    glColor3f(0.0, 0.0, 1.0);  glVertex3f(-0.5, 0.5, -0.5);  // P3 is blue 
    glColor3f(1.0, 0.0, 1.0);  glVertex3f(-0.5, -0.5, -0.5);  // P4 is purple 
    glEnd(); 

    // White side - BACK 
    glBegin(GL_POLYGON); 
    glColor3f(1.0, 1.0, 1.0); 
    glVertex3f(0.5, -0.5, 0.5); 
    glVertex3f(0.5, 0.5, 0.5); 
    glVertex3f(-0.5, 0.5, 0.5); 
    glVertex3f(-0.5, -0.5, 0.5); 
    glEnd(); 

    // Purple side - RIGHT 
    glBegin(GL_POLYGON); 
    glColor3f(1.0, 0.0, 1.0); 
    glVertex3f(0.5, -0.5, -0.5); 
    glVertex3f(0.5, 0.5, -0.5); 
    glVertex3f(0.5, 0.5, 0.5); 
    glVertex3f(0.5, -0.5, 0.5); 
    glEnd(); 

    // Green side - LEFT 
    glBegin(GL_POLYGON); 
    glColor3f(0.0, 1.0, 0.0); 
    glVertex3f(-0.5, -0.5, 0.5); 
    glVertex3f(-0.5, 0.5, 0.5); 
    glVertex3f(-0.5, 0.5, -0.5); 
    glVertex3f(-0.5, -0.5, -0.5); 
    glEnd(); 

    // Blue side - TOP 
    glBegin(GL_POLYGON); 
    glColor3f(0.0, 0.0, 1.0); 
    glVertex3f(0.5, 0.5, 0.5); 
    glVertex3f(0.5, 0.5, -0.5); 
    glVertex3f(-0.5, 0.5, -0.5); 
    glVertex3f(-0.5, 0.5, 0.5); 
    glEnd(); 

    // Red side - BOTTOM 
    glBegin(GL_POLYGON); 
    glColor3f(1.0, 0.0, 0.0); 
    glVertex3f(0.5, -0.5, -0.5); 
    glVertex3f(0.5, -0.5, 0.5); 
    glVertex3f(-0.5, -0.5, 0.5); 
    glVertex3f(-0.5, -0.5, -0.5); 
    glEnd(); 

    wglMakeCurrent(NULL, NULL); 

    SwapBuffers(g.hdc); 
    ReleaseDC(g.hwnd, g.hdc); 
    wglDeleteContext(g.hglrc); 
} 
+0

"リソースリーク"が発生すると思いますか? –

+0

ディスプレイコールでプログラムを実行したままにしておくと、RAMの使用量は簡単に100MBまで上昇し、増加し続けます。この関数の呼び出しを取り除くと、実行時間に関係なく、使用量は約27〜28mbsで一定に保たれます。だから私は、これがリソースリークの結果であると仮定します。なぜなら、このような振る舞いの原因となるものは他には見当たらないからです。 –

+1

関数の内容をコメント化し、問題がなくなったことを確認し、問題が戻ってくるまで、一度にライン/セクションのコメントを徐々に解除します。 –

答えて

4
g.hglrc = wglCreateContext(g.hdc); 

内にあるように、それを絞られています。

画面を再描画する必要があるたびにレンダリングコンテキストを作成しないでください。あなたはを一度作成します。;あなたのウィンドウが去ったときにだけ離れるべきです。

これで、レンダリングコンテキストを作成して破棄するとリソースが捨て去られてしまう理由は、必ずしも正当なものではありません。しかしそれは無関係です。 のパフォーマンスのために実行しないでください。レンダリングコンテキストの作成と破壊は高速なプロセスではなく、意図されていません。

+0

私はそれを機能から取り除くとかなりのパフォーマンスが向上しますが、リソースリークは持続しています。 –

+0

あなたが指摘しただけでなく、表示ループ内のすべての 'wgl'呼び出し、特に現在のコンテキストをnullにしてDCを解放する他のwin32行が、リソーススラッシュを引き起こすことは間違いありません。 –

関連する問題