2016-09-16 5 views
-2

Hallo Ich habe vor kurzem gelernt, Win32/opengl zu lernen, und ich habe es geschafft, eine Funktion zu schreiben, die einen mehrfarbigen Würfel in einem Fenster anzeigt. Mein Problem ist, dass es ein Ressourcenleck gibt, aber ich bin ratlos und nicht sicher, was genau ich vergessen zu löschen.Resource Leak opengl/win32

HINWEIS ich es verengt unten in dieser Funktion

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

Was lässt Sie glauben, dass es ein "Ressourcenleck" gibt? –

+0

Wenn ich das Programm mit dem Display-Aufruf laufen lasse, steigt die Ram-Auslastung leicht auf 100s von mb und wächst weiter. Wenn ich den Aufruf dieser Funktion entferne, bleibt die Verwendung konstant bei ungefähr 27-28 MB, unabhängig davon, wie lange sie läuft. Also nehme ich an, dass dies das Ergebnis eines Ressourcenlecks ist, da ich nichts anderes sehe, das ein solches Verhalten verursachen würde. –

+1

Kommentieren Sie den Inhalt der Funktion, vergewissern Sie sich, dass das Problem behoben ist, und geben Sie dann eine Zeile/einen Abschnitt nach und nach aus, bis das Problem wieder auftritt. –

Antwort

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

werden Sie das nicht tun.

Sie erstellen nicht jedes Mal einen Renderkontext, wenn Sie den Bildschirm neu zeichnen müssen. Sie erstellen es einmal; Es sollte nur weggehen, wenn Ihr Fenster verschwindet.

Nun, das ist nicht unbedingt zu rechtfertigen, warum das Erstellen und Zerstören eines Rendering-Kontextes Ressourcen herumliegen lassen würde. Aber das ist irrelevant; Sie sollten es wegen Leistung nicht tun. Rendering Context Creation und Destruction ist kein schneller Prozess und soll es auch nicht sein.

+0

Sie haben recht, es gibt eine erhebliche Leistungssteigerung, wenn ich es aus der Funktion nehme, aber das Ressourcenleck besteht fort. –

+0

Nicht nur die Zeile, auf die Sie hingewiesen haben, sondern alle 'wgl' Aufrufe in einer Display-Schleife, besonders die anderen Win32-Zeilen am unteren Rand, die den aktuellen Kontext auf Null setzen und den DC freigeben, werden zweifellos auch einen Ressourcen-Thrash verursachen. –