OpenGl Fragen
-
Mir ist die Syntax einer if-Anweisung durchaus klar, und ich habe es schonmal mit:
if (WM_LBUTTONDOWN == TRUE)
probiert, was aber auch nicht funktioniert hatte. (Was mich nicht sehr verwundert hatte)
Aber danke für den Link, er hat mir sehr geholfen!
Es klappt jetzt.Gruß,
Pablo
-
Hallo,
Wie im Titel steht, habe ich jetzt ein Ressourcen Problem. Immer wenn ich mein Programm starte, dann ist die Prozessorauslastung bei 60% und jede sekunde erhöht sich die Speicherauslastung um etwa 10000 K.
Gibt es irgendeine Funktion oder ähnliches um den Arbeitsspeicher wieder freizugeben? Oder einen Ansatz wie ich das machen könnte?
Würde mich sehr über jede Antwort freuen, da mich das Problem schon eine ganze Weile lang nervt.
Gruß,
Pablo
-
aber natuerlich hat man bei c++ fuer jede allokation auch eine deallokationsfunktion.
wuerdest du alles freigeben was du allokierst, wuerde der speicherverbrauch konstant bleiben.
wie allokierst du denn den speicher, bzw wofuer benutzt du pro sekunde 10000KB zusaetzlich?
-
Hallo rapso,
es liegt daran, dass solange das Programm läuft, immer wieder neue Objekte wie Quadrate oder Text auf den Bildschirm ausgegeben werden und die Alten nur mit:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f);
verschwinden lasse. Wenn ich mir jetzt z.B keinen Text mehr ausgeben lasse, dann steigt die Speicherauslastung nur noch so um etwa 100 K. Dies liegt dann an den Quadraten.
kannst du mir sagen wie man alle, bisher gezeichneten Objekte löscht, sodass die dann auch wirklich weg sind?
Ich danke schonmal,
Pablo
-
es waere von vorteil wenn du uns zeigen wuerdest welche zeilen speicher allokieren, denn dann koennten wir dir auch sagen wie du den freigeben kannst.
-
Also z.B hiermit:
glBegin(GL_QUADS); glColor3f(0.1f,0.1f,0.1f); glVertex2f(-1.0, 1.0); glVertex2f( 1.0, 1.0); glVertex2f( 1.0, 0.35); glVertex2f(-1.0, 0.35); glColor3f(0.1f,0.1f,0.15f); glVertex2f(-0.12, 0.37); glVertex2f( 0.12, 0.37); glVertex2f( 0.1, 0.33); glVertex2f(-0.1, 0.33); glEnd();
erstelle ich 2 Quadrate, die jedoch immer wieder neu gezeichnet werden, solange das Programm läuft. Genauso ist es mit:
glColor3f(1.0f,0.0f,0.0f); glRasterPos2f(-0.03f,0.34f); glPrint("text", -35);
Da kann ich mir schon denken, dass dies Ressourcen zieht.
Pablo
-
und wenn du diese zeilen (und nur diese) auskommentierst, dann steigt der speicherverbrauch nicht mehr um 10000kb/s ?
-
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.
-
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ß,
PabloHast 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