Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 16:42

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: OpenGL hängt ?
BeitragVerfasst: Mi Mär 15, 2006 13:51 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

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..

Grüße
Passi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 15, 2006 14:11 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 15, 2006 14:11 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Renderst du im OnIdle? Wenn ja dann guck mal ob du "done" auf false setzt.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 15, 2006 17:05 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

also mein MainCode sieht wie folgt aus:

Code:
  1. procedure TForm1.FormActivate(Sender: TObject);
  2. var
  3.   QPCStart, QPCEnd : Int64;
  4. begin
  5.   Spiel:=cGame.Create;
  6.   spiel.Initialize;
  7.  
  8. While Spiel.GibAusfuehrung do
  9. begin
  10.  
  11. application.ProcessMessages;
  12.  
  13.     spiel.Control.Main();
  14.  
  15. QueryPerformanceCounter(QPCStart);
  16. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  17.  
  18.   enableortho();
  19.  
  20.     spiel.Surface.DrawGame;
  21.     spiel.pText.Calculate(timefactor);
  22.     spiel.pText.zeichnen;
  23.  
  24.   disableortho();
  25.  
  26. SwapBuffers(DC);
  27. QueryPerformanceCounter(QPCEnd);
  28. TimeFactor := ((QPCEnd-QPCStart) / QPCFreq) * 70;
  29.  
  30. form1.Caption := inttostr(fpscount());
  31.  
  32. end;
  33.  
  34. form1.Close;
  35. end;


Also eigentlich kein Grund, einfach mit dem Rendern aufzuhören -.-

// edit Lossy: Code durch Pascaltags ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 15, 2006 17:15 
Offline
DGL Member
Benutzeravatar

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. :twisted:

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 15, 2006 17:29 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

danke für die Antwort :)!

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 :roll:


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 ^^)

Danke + Grüße
Passi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 15, 2006 22:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ließ dir unbedingt das Tutorial quickstart durch! Da steht drinnen wie mans machen muss/kann/sollte.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 08:47 
Offline
DGL Member
Benutzeravatar

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. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 13:53 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

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;

:shock:

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:
  1.  
  2. type cGame=class
  3.   private
  4.     private derGameSpeed: real;
  5.     private dieAusfuehrung: boolean;
  6.  
  7.  
  8.   public
  9.     Map : cMap;
  10.     Surface: cSurface;
  11.     Player: cPlayer;
  12.     Control: cControl;
  13.     pText: cParticleEffekt;
  14.     procedure Main();
  15.     procedure Initialize();
  16.  
  17.   end;
  18.  


Code:
  1.  
  2. procedure cGame.Initialize();
  3. begin
  4.   Randomize();
  5.   Player := cPlayer.Create; // <- Funktioniert nicht!
  6. //  Map := cMap.create;
  7. //  Map.Load('Test');
  8. //  Surface := cSurface.Create;
  9. //  Control := cControl.Create;
  10. //  pText := cParticleEffekt.create(500);
  11. end;
  12.  


Danke + Grüße
Passi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 14:29 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 14:46 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 14:52 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

die Kontruktoren und Destruktoren sind unangetastet.. d.h. da steht nichts drin.

Die Klasse Game wird bei Form onCreate erstellt und Initilisiert..

Das Ganze hat 1:1 so ja im alten Projekt funktioniert, deswegen verstehe ich das auch nicht..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 16:15 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

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..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 16:45 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 16, 2006 17:15 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
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 ;)

Hier mal der Code:

Code:
  1.  
  2. procedure TForm1.FormCreate(Sender: TObject);
  3. begin
  4. [...]
  5. Application.OnIdle := Render;
  6. end;
  7.  
  8. procedure TForm1.Render(Sender: TObject; var Done: Boolean);
  9. var
  10.   QPCStart, QPCEnd : Int64;
  11. begin
  12.  
  13. QueryPerformanceCounter(QPCStart);
  14. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  15.  
  16.      Game.Main();
  17.  
  18. SwapBuffers(DC);
  19.  
  20. QueryPerformanceCounter(QPCEnd);
  21. TimeFactor := ((QPCEnd-QPCStart) / QPCFreq) * 70;
  22.  
  23. form1.Caption := inttostr(fpscount());
  24.  
  25. Done := False;
  26.  
  27. end;
  28.  



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..


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 15 Queries | GZIP : On ]