OpenGl Fragen



  • Wenn ich alle Zeilen auskommentiere die mir den Text ausgeben, dann steigt die Speicherauslastung so um 100 K.

    Wenn ich nur die Zeilen von oben auskommentiere, dann steigt die Speicherauslastung so um 200 K.

    Aber eigentlich dürfte die doch so oder so nicht steigen, da ich doch immer den Bildschirm mit:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-1.0f);
    

    leere, oder?

    Pablo



  • Dir fehlt eine erhebliche Menge an Grundverstaendnis von OpenGL und C++.
    Ich weiss leider gar nicht wo man da anfangen soll.
    Wie stellst Du Dir denn den Zusammenhang zwischen "uebergebenen Eckpunktpositionen" und "dem Fuellen des Bildschirms mit der Hintergrundfarbe" vor?
    Du kannst davon ausgehen, dass OpenGL in der Lage ist, alle uebergebenen Daten so zu managen, dass keine Speicherlecks entstehen. Wenn Dein Speicherverbrauch steigt liegt das lediglich daran, dass *Du* Speicher allozierst und nicht wieder freigibst.


  • Mod

    FzK_Pablo schrieb:

    Wenn ich alle Zeilen auskommentiere die mir den Text ausgeben, dann steigt die Speicherauslastung so um 100 K.

    Wenn ich nur die Zeilen von oben auskommentiere, dann steigt die Speicherauslastung so um 200 K.

    Aber eigentlich dürfte die doch so oder so nicht steigen, da ich doch immer den Bildschirm mit:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-1.0f);
    

    leere, oder?

    Pablo

    soviel code hast du doch sicher noch nicht, poste doch ein wenig mehr, ich sehe in den 3 zeilen die du jetzt gepostet hast keinen zusammenhang zu dem was du vorher gepostet hast. ich sehe auch nicht wie die zeilen dort ueberhaupt speicher allokieren sollten, vor allem nicht fast 10MB/s, dein program duerfte nach ein paar minuten ja nicht mehr laufen.
    vielleicht generierst du displaylisten ohne sie frei zu geben oder sowas?



  • Hallo,

    Wenn ich alles auskommentiere bis auf:

    int DrawInterface(const char *menucaption)
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();									
    glTranslatef(0.0f,0.0f,-1.0f);	
    
    glBegin(GL_QUADS);	 
    glColor3f(0.1f,0.1f,0.1f);								
     glVertex2f(float(-1.0), float(1.0  ));						
     glVertex2f(float( 1.0), float(1.0  ));			
     glVertex2f(float( 1.0), float(0.35 ));					
     glVertex2f(float(-1.0), float(0.35 ));	
    glColor3f(0.1f,0.1f,0.15f);							
     glVertex2f(float(-0.12), float(0.37));
     glVertex2f(float(0.12 ), float(0.37));
     glVertex2f(float( 0.1 ), float(0.33));
     glVertex2f(float(-0.1 ), float(0.33));
    glEnd(); 	 
    
    glColor3f(1.0f,0.0f,0.0f);		  	
    glRasterPos2f(-0.03f,0.34f);	
    glPrint(menucaption, 35);
    return true;
    }
    

    und:

    int checkmsg(void)
    {
      if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
      {
    	if (msg.message==WM_QUIT)
    	{
    		keys[VK_ESCAPE] = true;
    	}
            else									
    	{
    		TranslateMessage(&msg);	
    		DispatchMessage(&msg);	
    	}
      }
      return true;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
      if (!CreateGLWindow("ping pong by pablo",1680,1050,32,fullscreen))
      {
    	return 0;
      }	
      while (!keys[VK_ESCAPE])
      {
    	checkmsg();			
    	DrawInterface("Main Menu");
            Sleep(100);	
    	SwapBuffers(hDC);			
      }				
      return true;
    }
    

    dann erhöht sich die Speicherauslastung jede Sekunde um etwa 2000 kb/s.

    Die Zahl bei: glPrint(menucaption, 35); gibt nur die Größe der Schrift an.

    Im kompletten Zustand würde ich einfach nur weitere Boxen und Schriften ausgeben lassen, also denke ich, es ist unnötig die entsprechenden Zeilen auch noch hier hinzuschreiben.

    vielleicht generierst du displaylisten ohne sie frei zu geben oder sowas?

    Was sind displaylisten?

    Gruß, Pablo



  • FzK_Pablo schrieb:

    Hallo,

    Wenn ich alles auskommentiere bis auf:

    int DrawInterface(const char *menucaption)
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();									
    glTranslatef(0.0f,0.0f,-1.0f);	
    
    glBegin(GL_QUADS);	 
    glColor3f(0.1f,0.1f,0.1f);								
     glVertex2f(float(-1.0), float(1.0  ));						
     glVertex2f(float( 1.0), float(1.0  ));			
     glVertex2f(float( 1.0), float(0.35 ));					
     glVertex2f(float(-1.0), float(0.35 ));	
    glColor3f(0.1f,0.1f,0.15f);							
     glVertex2f(float(-0.12), float(0.37));
     glVertex2f(float(0.12 ), float(0.37));
     glVertex2f(float( 0.1 ), float(0.33));
     glVertex2f(float(-0.1 ), float(0.33));
    glEnd(); 	 
    
    glColor3f(1.0f,0.0f,0.0f);		  	
    glRasterPos2f(-0.03f,0.34f);	
    glPrint(menucaption, 35);
    return true;
    }
    

    und:

    int checkmsg(void)
    {
      if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
      {
    	if (msg.message==WM_QUIT)
    	{
    		keys[VK_ESCAPE] = true;
    	}
            else									
    	{
    		TranslateMessage(&msg);	
    		DispatchMessage(&msg);	
    	}
      }
      return true;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
      if (!CreateGLWindow("test",1680,1050,32,fullscreen))
      {
    	return 0;
      }	
      while (!keys[VK_ESCAPE])
      {
    	checkmsg();			
    	DrawInterface("Main Menu");
            Sleep(100);	
    	SwapBuffers(hDC);			
      }				
      return true;
    }
    

    dann erhöht sich die Speicherauslastung jede Sekunde um etwa 2000 kb/s.

    Die Zahl bei: glPrint(menucaption, 35); gibt nur die Größe der Schrift an.

    Im kompletten Zustand würde ich einfach nur weitere Boxen und Schriften ausgeben lassen, also denke ich, es ist unnötig die entsprechenden Zeilen auch noch hier hinzuschreiben.

    vielleicht generierst du displaylisten ohne sie frei zu geben oder sowas?

    Was sind displaylisten?

    Gruß, Pablo



  • if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    

    Pro Frame fallen erheblich mehr als ein Event an, darum mach' aus dem if mal ein while.



  • hi hellihjb,

    das ist eine gute Idee und ich habe diese Variante auch schon ausprobiert, aber diese hat leider auch nichts an dem Speicherproblem geändert. Hättest du einen anderen Vorschlag?

    Gruß,
    Pablo



  • FzK_Pablo schrieb:

    hi hellihjb,

    das ist eine gute Idee und ich habe diese Variante auch schon ausprobiert, aber diese hat leider auch nichts an dem Speicherproblem geändert. Hättest du einen anderen Vorschlag?

    Gruß,
    Pablo

    Hast du irgendwo ein new() oder ein malloc()? Das sind die einzigen Funktionen in C/C++ die Speicher allokieren koennen.



  • Hi DEvent,

    ich habe nichts dergleichen in meinem Quellcode. Ich denke, die Speicherauslastung kommt daher zustande, dass ich mir immer wieder Objekte wie Rechtecke ausgeben lasse. Kann es sein, dass er die Alten in den Arbeitsspeicher schreibt?

    Gruß,
    Pablo



  • Ich denke, die Speicherauslastung kommt daher zustande, dass ich mir immer wieder Objekte wie Rechtecke ausgeben lasse

    Und man hat Dich auch mehrmals darauf hingewiesen, dass das nicht sein kann.



  • Das weiß ich, aber wenn ich mir keine Objekte ausgeben lasse, dann erhöht sich die Speicherauslastung nicht.

    So. Ich habe jetzt das Problem gelöst. Es lag an der funktion glPrint;

    Danke für eure Hilfe,

    Gruß
    pablo


Anmelden zum Antworten