2016-09-16 130 views
-2

您好我最近開始學習win32/opengl,並且我設法編寫了一個在窗口中顯示多色多維數據集的函數。我的問題是有一個資源泄漏,但我很難過,不知道我忘了什麼忘記刪除。資源泄露opengl/win32

注意我已經把範圍縮小是這個函數中

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的使用很容易達到100 MB,並繼續增長。如果我刪除了對此函數的調用,則無論運行多長時間,其使用率都保持在27-28mbs左右。所以我認爲這是資源泄漏的結果,因爲我沒有看到任何會導致這種行爲的東西。 –

+1

註釋掉該功能的內容,確認問題已消失,然後逐漸取消註釋某一行/部分,直到問題恢復。 –

回答

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

不要那樣做。

每次需要重新繪製屏幕時,都不會創建呈現上下文。你創建它一次;它應該只在您的窗口消失時消失。

現在,這並不一定是爲什麼創建和銷燬渲染上下文會使資源閒置的原因。但這是無關緊要的;你不應該這樣做,因爲性能。渲染上下文的創建和銷燬不是一個快速的過程,也不是它的目的。

+0

當然,如果我將它從功能中解放出來,但是資源泄漏仍然存在,那麼您的工作就會顯着提升性能。 –

+0

不僅僅是你指出的那條線,而是顯示循環中的所有'wgl'調用,特別是底部附近的其他win32行,使當前上下文爲空並釋放DC無疑會導致資源浪費。 –