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

Aktuelle Zeit: Fr Jul 18, 2025 12:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mo Mär 20, 2006 15:09 
Offline
DGL Member

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

so langsam verstehe ich die Welt nicht mehr..

Ich hab ein Programm, das eigentlich bisher wunderbar läuft. Das einzige, große Problem: Sobald ich mit der Maus über das OpenGL Fenster fahre, wird die Geschwindigkeit des Programms um etwa die Hälfte reduziert!

Dies äußert sich nur in der Berechnung von Positionen etc., die FPS bleiben gleich!

Nun das seltsamste an der Geschichte: Das Programm wird nur langsam, wenn ich meinen Partikeleffekt ausschalte! Sobald dieser berechnet und gezeichnet wird, juckt ihn das kein bisschen wenn die Maus über dem Fenster ist!

Ich hab das Programm mal zur Verdeutlichung (und da ich nicht im Geringsten weiß, woran das liegen könnte..) angehängt:
http://www.pikosky.sk/JR.rar

Das Problem konnte ich nicht auf allen von mir getesteten PCs reproduzieren..

Versucht auch mal, in der Methode uGame.Main den Aufruf der pText.Calculate(); wieder zu aktivieren.. denn dann geht es, wie schon gesagt, bei mir seltsamerweise.. :shock:


Ich hoffe Ihr könnt mir helfen!

Danke + Grüße
Passi

PS: Was mir noch aufgefallen ist, auf einem anderen PC: wenn ich oben auf das X gehe, und dieses ToolTip "Schließen" erscheint, dann wird auch das ganze Programm langsamer..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 20, 2006 15:26 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Passi hat geschrieben:
Das Problem konnte ich nicht auf allen von mir getesteten PCs reproduzieren..

Kann es auch nicht reproduzieren.
Lustigerweise ist das Programm bei mir aber einmal gecrashed, als ich beim Start zum Browser gewechselt bin :?


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

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Öm also eigentlich darf das nur crashen wenn man zu weit nach links/rechts läuft ^^ bzw. von dem Laufsteg runterfällt.

Ich versteh das nicht, vor allem weil ich den QueryPerformanceCounter nutze, da kann sowas doch eigentich gar nich passieren -.-


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

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also das mit dem Tooltipp würde ich ignorieren. Da kannst du auch nicht dran ändern. Das ist durchaus normal.

Kann das Problem aber auch nicht nachvollziehen. Aber wenn die FPS gleich bleibt, dann ist es schon verwunderlich. Kann es sein, dass es nur ein Grafikproblem ist? Also, dass es nur den eindruck erweckt, dass es anders weil es Sync des Monitors beißt. Mach mal VSync an und schau noch mal. Anderefalls würde ich mir mal verschiedene Wert ausgeben lassen. Und schauen ob sich was entscheidendes ändert.

PS: Deine Unitaufteilung ist ein bisschen verwirrend. ;-)

PPS: Die Abfragerei der Keys kannst du besser machen. Entweder reagierst du auf KeyDown/Up und setzt dann den Eintrag oder du benutzt permanent getasynckeystate. Derzeit ist es so, dass du 254 unnötige Aufrufe pro Frame hast. Im übrigen funktionieren die Taste auch wenn die Anwendung gar nicht aktiv ist.

Und noch was.
Code:
  1. if getasynckeystate(i) <> 0 then
  2.    pressedKeys[i] := true
  3. else
  4.    pressedKeys[i] := false;

Geht wesentlich einfacher und macht das Selbe. Ist vielleicht sogar ein tausenstel µs schneller, da du so das Ergebniss des Vergleiches sofort zuweist und nich noch mal testen musst. Und es ist kürzer. Bin ja schreibfaul. \";-)\"
Code:
  1. pressedKeys[i] := getasynckeystate(i) <> 0;


PPPS: Deine Steintextur ist nicht OpenGL Konform. Wobei das ja auch ne Falschaussage ist. Damit die Textur funktioniert muss mindestens OpenGL 2.0 (oder NPOT Extension) vorhanden sein.

Verstehe das bitte nicht als Kritik sondern als Tipps von Jemandem der das schon ne ganze Weile macht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 18:11 
Offline
DGL Member

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

vielen Dank für deine Antwort :)

Also, wenn ich VSync aktiviere, dann ist das Ganze noch viel schlimmer irgendwie.. nicht nur das es anfängt ohne Maus überm Fenster mal schneller und mal langsamer zu laufen, mit Maus überm Fenster läuft das gesamte Programm dann plötzlich nur noch mit etwa 1/10 der Originalgeschwindigkeit..

A Propos verschiedene Werte ausgeben lassen. Ich hab mir testweise mal den Timefactor in die FormCaption geschrieben. Und da tritt dann gleich das nächste Phänomen auf: Sobald ich das da reinschreiben lasse, läuft das Programm immer so langsam :shock: ! Egal ob Maus drüber oder nicht!


Zu deinen anderen Tips: Ich bin froh wenn mir jemand das alles beibringt also keine falsche Hemmungen ;)

Mit KeyUp/Down habe ich zuerst gearbeitet, das hat nicht wirklich geklappt da bei 3 gleichzeitigen Tasten dann mindestens eine nicht mehr erkannt wurde. Die Kurzschreibweise gefällt mir auch sehr gut ^^ :) - Und zu der Schleife.. naja das ist so geplant, dass die Tasten später frei zugeweisen werden können. Da steht dann eben z.B. in der Control.processKeys nicht mehr

Code:
  1.  
  2. if pressedKeys[37] then
  3. begin
  4. ...
  5.  


sondern

Code:
  1.  
  2. if pressedKeys[Game.Options.KeyLeft] then
  3. begin
  4. ...
  5.  


d.h. ich weiß nicht welche Tasten ich abfragen muss.. und selbst wenn ich das wüsste wären das doch an die 15-20 und ob es sich da dann lohnt die alle einzeln abzufragen..?


Steintextur: Nur konform wenn Auflösung Potenz von 2 oder? Hm damit hab ich so meine Probleme bei der Grafikgestaltung.. ^^ Was macht man da?


Also nochmal Danke für Deine Antwort und ruhig immer her mit den Tipps ;)

Grüße
Passi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 18:46 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Ok noch was. Ich habe so eben bemerkt, dass das Programm nur langsam wird, wenn es ab Start den Fokus hat.

Also Beispiel:

Ich starte das Programm. Fahre mit der Maus darüber -> langsam.
Ich lasse es gestartet, hole ein anderes Programm in den Vordergrund, minimiere das dann wieder, fahre mit der Maus über das Programm -> normalschnell :shock:

Edit: Ok das war ne Falschmeldung, bzw. nicht ganz korrekt, war nur Zufall..

Das ganze läuft normalschnell, sobald mal die Maus für ca 10 Sekunden bewegungslos auf dem Fenster lässt.. dann läufts plötzlich normal... !?


Das ist wirklich.. sehr, sehr merkwürdig..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 22:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Das ist wirklich.. sehr, sehr merkwürdig..

Das kann ich ganz ehrlich nicht abstreiten. Auch wenn ich dir bei diesem Problem gerade absolut nicht helfen kann. So etwas kenne ich nicht wirklich. Evtl könnte es auch was mit der VCL Form sein. Also etwas mit Hints oder so. Die benutzen dafür intern nen Timer und 10 Sek klingen fast danach. Ist aber nur rein Spekulativ. Habe noch nie gehört, dass so ewtwas bremst.


Zitat:
if pressedKeys[Game.Options.KeyLeft] then

Du prüfst ja sowieso in jedem Frame nach ob die Tasten gedrückt sind also kannst du dir das Cachen sparen. Im Endeffekt machst du nichts anderes als alle Tasten abzufragen. Wenn du aber nur die Tasten abfragst die brauchst ist das doch logischerweise weniger.

Code:
  1. if GetAsyncKeyState(Game.Options.KeyLeft) then

Das tut es vollkommen. Mit allem was du haben willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 22:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bevor hier noch Lossys Glaskugel anläuft sollten wir vielleicht nochmal einen Blick auf den Code werfen.

Hast du eigentlich mal auf OpenGl-Fehler geprüft?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 21, 2006 14:46 
Offline
DGL Member

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

also glGetError gibt zu keinem Zeitpunkt einen Fehler aus..

Es könnte auch ein Treiberproblem oder ähnliches sein.. wie gesagt, auf meinen 2. Rechner läuft das z.B. immer so wie es soll, egal ob Maus drüber oder nicht..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 24, 2006 23:48 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Habt ihr noch ne Idee?

Ich hab soeben ein Quad auf einer Sinus-Kurve laufen lassen, Berechnung per Timefactor.

Ohne Maus drüber: Amplitude ca. 100 Pixel
Mit Maus drüber: Amplitude ca. 500 Pixel, aber gleiche Geschwindigkeit :shock:

Ich versteh's nicht...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 09, 2008 01:54 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 19:29
Beiträge: 38
Hallo,
will den Thread mal wieder zum Leben erwecken, da ich zur Zeit das gleiche Problem habe. Ich nutze Vista x64 mit Aero etc. und habe nen C2D E8400, 4GB Ram und ne 8800GT, an Power sollte es da nicht Mangeln.

Sobald meine Maus über dem Fenster ist wird alles extrem langsam, ziemlich nervige Sache das. Habe das normale Template von euch (OpenGL 1.5) und lasse ein Dreieck rotieren, mehr nicht. Keine Mausabfragen, nichts.

Hat vielleicht jetzt jemand 'ne Lösung parat? :)


Gruß


Edit: Das muss an meinem Timebased Movement liegen.. Hmm..

Code:
  1. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  2. begin
  3.   QueryPerformanceCounter(StartCount);
  4.   Render();
  5.   QueryPerformanceCounter(EndCount);
  6.   Speedfactor := ((EndCount - StartCount) /Frequency) * Scalefactor;
  7. end;

Kanns sein, dass Vista damit irgendwie nicht zurecht kommt?

Mit GetTickCount das gleiche in Grün, nur stottert es da mehr.


Edit2:
Lösung gefunden! Auf ApplicationEventsIdle verzichten, stattdessen eine Endlosschleife nutzen.
Sorry, dass ich den alten Thread nochmal rausgekramt habe, aber vielleicht kanns ja nochmal jemandem helfen..

_________________
Mein aktuelles Projekt: *klick*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 09, 2008 07:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Als kleine Zusatzinfo. Das Idleevent betrachtet in deinem Falle auch nur die Zeit fürs Rendern aber nicht die Zeit die Windows und dein Anwendung verbraten. Wenn du mit der Maus über das Formular fährst werden reichlich andere Events gesendet. Diese müssen erzeugt und verarbeitet werden etc. Da du bei einem einfachen Dreiecke sehr viele IdleEvents bekommst und die sehr schnell abarbeitest fallen natürlich kleinere Schwankungen noch wesentlich stärker auf als wie wenn du gerade mal 40-50 Bilder in der Sekunde schaffst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 09, 2008 09:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
du solltest eifach zu dem obrigen Code volgende Zeile ergänzen
Code:
  1.  
  2. Done := False;
  3.  


un schon läuft alles wies soll würd ich ma sagen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 09, 2008 13:00 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 19:29
Beiträge: 38
FrenK hat geschrieben:
du solltest eifach zu dem obrigen Code volgende Zeile ergänzen
Code:
  1.  
  2. Done := False;
  3.  


un schon läuft alles wies soll würd ich ma sagen


Das war bei mir drin, hatte es nur vergessen hier mit reinzukopieren... Die Gründe wären dann schon die, die Lossy genannt hat.

Aber eine Frage hätte ich trotzdem noch: was wäre die *perfeke* Methode um zu rendern? Ich denke, dass so ne Endlosschleife auch nicht gerade das non-plus-ultra ist, oder?

_________________
Mein aktuelles Projekt: *klick*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 09, 2008 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Done := False; bewirkt soweit ich weis das IDLE nicht nur zu beginn der "IDLE Fase" sonder immer wieder wärend der Fase aufgerufen wird daher mein Kommentat...
Zu deiner Frage : Es giebt nicht die perfekte Methode, was sich gut eignet ist Situationsabhängig


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.009s | 15 Queries | GZIP : On ]