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..
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..
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:
if getasynckeystate(i) <> 0then
pressedKeys[i]:=true
else
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:
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.
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 ! 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:
if pressedKeys[37]then
begin
...
sondern
Code:
if pressedKeys[Game.Options.KeyLeft]then
begin
...
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
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
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... !?
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:
if GetAsyncKeyState(Game.Options.KeyLeft)then
Das tut es vollkommen. Mit allem was du haben willst.
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..
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..
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..
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.
du solltest eifach zu dem obrigen Code volgende Zeile ergänzen
Code:
Done := False;
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?
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
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.