ich hab seit neuestem das Problem, das meine OpenGL Anwendung ca. 2-20 Sekunden nach dem Start einfach hängen bleibt. Die FPS in der Caption werden weiterhin aktualisiert, d.h. die Main Schleife läuft weiter!
Das Hängen äußert sich so, dass das Bild nicht mehr aktualisiert wird. Schiebe ich z.B. ein kleines Fenster vor die OGL Anwendung, so hinterlässt diese einen grauen Streifen.
Woran kann das liegen? Das ist nur bei einer Anwendung so, andere Anwenddungen hängen nicht..
Registriert: Di Sep 06, 2005 18:34 Beiträge: 362 Wohnort: Hamburg
Hi ...
ich weiß nicht ob dir so jemand helfen kann, der für die Aktualisierung relevante Code wäre evtl ganz hilfreich, dann kann dir bestimmt jemand helfen ...
Gruß
Shai
_________________ Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Also eigentlich kein Grund, einfach mit dem Rendern aufzuhören -.-
Wenn du mich fragst ist das sogar ein Grund für noch viel mehr.
Kleiner Scherz. So solltest du auf keinen Fall rendern.
1. FormActivate wird immer dann aufgerufen, wenn dein Fenster aktiviert wird. Was passiert also, wenn du es deaktivierst und dann wieder aktivierst?
2. Du renderst so, dass du dich permanent in einer Methode befindest. Unter Umständen kann ein Druck auf den CloseButtom im Fenster deine Anwendung komplett einfriehren.
3. Du musst dich selber darum kümmern, dass die Messages abgearbeitet werden. (Application.ProcessMessages). Ich persönlich mache so etwas nur so, wenn es wirklich nicht anders geht. Aber auch dann habe ich immer wieder echt fiese Seiteneffekte gehabt.
Schnapp dir am Besten ein Template und schaue dir an wie es dort gemacht wird.
Also grober VCL-Aufbau in etwa so.
Form.OnCreate (oder OnShow) -> Kontex erstellen.
Form.OnDestroy (oder OnClose) -> Kontex zerstören
Application.OnIdle -> Szene Rendern
Mit so einem Aufbau gewährleistest du, dass deine Anwendung nach jedem Frame die Möglichkeit hat sinnvoll und sicher auf die Events zu reagieren.
Ok, dann werd ich das Programm mal so umschreiben.. vllt. löst das ja auch das Problem, dass wenn ich unter 200 FPS komme, und dann mit der Maus über das Fenster fahre, das Ganze seltsam zu ruckeln anfängt
Was ich nicht ganz verstehe ist, wie meinst Du das, ich bleibe immer innerhalb einer Methode? Wie soll ich das sonst machen? Muss ja in irgendeiner Methode die gesamten Abläufe hintereinander abarbeiten lassen, oder? (Der Close Button funktioniert jedenfalls ^^)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Der Close Button funktioniert jedenfalls
Dann hast du Glück. Muss aber nicht zwangsläufig überall so sein.
Zum Verständniss. Windows ist Eventbasiert (oder Messagebasiert). Windows sendet für alle eine Message. Diese wird dann kurz abgearbeitet und es wird dann auf neue Messages gewartet.
In sofern hast du recht deine Anwenung läuft in einer Methode ab. Diese arbeitet dann auch die Messages ab und ruft zum Beispiel ButtonOnClick oder FormOnActivate auf. Aber das diese Methode sollte eigentlich die Einzigste sein die permanent läuft. Davon gibt es pro Thread eine.
Wie dem auch sei. Du hast in OnActivate eine Endlosschleife in der du renderst. Das solltest du nur so machen, wenn du entweder dafür einen eigenen Thread hast oder du solltest es entweder per Timer oder per OnIdle machen. Und dann auch nur ein Bild rendern. So wird diese Methode per Message (ob Timer oder OnIdle) von Windows angesteuert. Und alle sind glücklich.
danke für eure Antworten! Also ich bin nun hergegangen und hab mein Programm so aufgebaut wie in dem Tutorial beschrieben. Funktioniert auch soweit.
Jetzt wollte ich aber meine ganzen Klassen aus dem alten Projekt einbinden, und da gibt's plötzlich ein Problem:
Eingebunden sind die entsprechenden Units zwar, aber seltsamer weise spuckt Delphi jetzt eine Zugriffsverletzung bei Adresse blabla aus, und zwar bei jedem Befehl der Art:
Objekt := eigeneKlasse.create;
Woran kann das liegen?! Erstelle ich in der Hauptunit ein Objekt und create es dort, funktioniert es.. erstelle ich es aber in der Initilisierungsmethode meiner Hauptklasse, funktioniert es nicht?
Bevor das nicht geht kann ich leider auch nicht ausprobieren ob das das Häng-Problem gelöst hat..
Hier mal der entsprechende Code:
Hauptklasse:
Code:
type cGame=class
private
private derGameSpeed:real;
private dieAusfuehrung:boolean;
public
Map : cMap;
Surface: cSurface;
Player: cPlayer;
Control: cControl;
pText: cParticleEffekt;
procedure Main();
procedureInitialize();
end;
Code:
procedure cGame.Initialize();
begin
Randomize();
Player := cPlayer.Create;// <- Funktioniert nicht!
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Machst du denn etwas in dem Konstruktor der Klasse cPlayer? So spontan kann ich nicht erkennen woran da etwas liegt. Wenn ja poste das bitte mal. Denke nämlich mal, dass du da auf irgendetwas zugreifst was nicht existiert oder so. Bzw. würde mich auch mal interessieren wo du das Initialize aufrufst bzw ob du diese Klasse auch mit Create erstellt hast. Kann auch sein, dass du das nur vergessen hast und es nicht beim Erstellen von cPlayer krachst sondern beim Zuweisen von der Membervariable Player.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was ich mir vorstellen könnte ist, das im onCreate des Players auf die Klasse Game zugegriffen wird. Die selber wurde aber noch gar nicht fertig erstellt. Ich schätze das Initialize wird im OnCreate vom Game aufgerufen. -> Ein Teufelskreis.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
sorry hab meinen Fehler gefunden, hatte doch tatsächlich vergessen ein Objekt der Klasse cGame zu erstellen -.-
Naja nun funktioniert mal wieder alles so wie es soll. Nur etwas verwundert mich:
Ich hab für exakt die selbe Szene ca. 600 FPS weniger! Statt 1300 nur noch 700-800! Ist das normal!?
Außerdem kann ich seltsamerweise keine BlendModes mehr setzen.. hat einfach keine Auswirkungen, selbst wenn ich den Modus direkt vor dem Quad zeichnen setze .. !? (gl_BLEND ist aktiviert..)
Danke für eure Hilfe!
Grüße
Passi
PS: Bisher ist das Programm noch nicht gehangen.. sieht also ganz gut aus. Hat sich aber vorher auch nur ab und an aufgehängt..
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Für die BlendModes würde ich mal glGetError befragen. Es kann sein, dass du da einen Fehler bekommen hast. Ansonsten wüsste ich nicht, warum es nicht gehen sollte. GL_ONE & GL_ONE bewirken in jedem Fall immer etwas. Die sind von Alphakanal oder so abhängig, falls du einfach nur die falschen Parameter gesetzt hast.
Wenn du mit OnIdle (done auf False) arbeitest ist das so ziemlich das Maximum was du bekommen kannst. Okay. Unter Umständen hängt es per Message geringfügig hinter der Endlosschleife aber das sollte sich nicht so äußern. Wobei je nach Karte 700-800 auch durchaus im Rahmen des Erträglichen sind. Ich überlege auch ob du es evtl geschaft haben könntest, dass der Counter 2 mal hochgezählt wird. Also durch das OnActivate aber ich glaube nicht. Wie dem auch sei. Ich würde da vorerst noch keinen großen Kopf drum machen.
Also die FPS haben sowohl im alten Projekt gesimmt, und stimmen auch jetzt im neuen. Denn Fraps (zeigt einem FPS bei D3D/OGL Games an) zeigt in etwa die selben Ergebnisse.
Naja kein Kopf drüber machen... das alte Projekt lief auf einem etwas "älteren" PC (3,2Ghz, 256Mb Radeon 9600) nur mit 230 FPS, und wenn da jetzt auch ein Performance Verlust von 50% entsteht, ist das ja nicht gerade super .. Zur Info: dabei werden 750 Partikel gerendert, also nicht wundern wieso so wenig FPS
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Game.Main();
SwapBuffers(DC);
QueryPerformanceCounter(QPCEnd);
TimeFactor :=((QPCEnd-QPCStart)/ QPCFreq)*70;
form1.Caption:=inttostr(fpscount());
Done :=False;
end;
Zum BlendMode. Hab mir mal wie von dir empfohlen Fehler ausgeben lassen, ist aber keiner aufgetreten (Rückgabewert war immer 0).
Hab aber grad den Fehler entdeckt.. ich hab aus Versehen eine alte Unit meiner OpenGLTools eingebunden, da hab ich noch den BlendMode bei jedem Quad Zeichnen neu gesetzt.. nu funktionierts
Aufhängen tut sich das Programm allem Anschein nach auch nicht mehr .. Ist nur noch die Frage offen, weshalb die Performance plötzlich so "in den Keller" geht..
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.