Ja ich bin auch fleißig mit Delphi auch wenn man das nicht denkt. Komme auch sehr gut zurecht. Werde demnächst hoffentlich auch was zeigen können aber zuerst mal eine Frage zur Timebased Movement. In dem Bomberman Tutorial ist es auch sehr schön erklärt. Es gibt nur ein Problem mit der Maus. Wenn ich wie im Bomberman Beispiel
mache, werden die Bewegungen langsamer sobald sich die Maus im Fenster befindet. Die FPS bleiben aber unverändert. Komischerweise läuft das auf meinem uralten Rechner (Athlon XP 2400+ mit Windows XP) und auf einem Dual Core Rechner mit Vista aber problemlos nur auf dem neuen (Intel Quad Core und Windows 7) funktioniert das so nicht. Bewege ich die Maus aus dem Fenster läuft es wieder einwandfrei. Wollte mich für diese Timervariante entscheiden weil die ja super funktioniert hat bloß jetzt nicht mehr. Wie kann man dieses Problem lösen? Bin auch Treibermäßig up to date. Ich weiß zwar sonst viel aber das nicht
Zuletzt geändert von Frase am Sa Jan 30, 2010 20:09, insgesamt 1-mal geändert.
Kann das sein du OnIdle nutzt zum rendern ? Wann ja, hast du die variable "var done: boolean" aus der function auch am ende auf false gesetzt ? Das wird nämlich dein problem sein vermute ich. Das muss auf false
Erstmal Danke an euch für die Hinweise aber es geht nicht mehr. Ja ich benutze OnIdle zum Rendern und Done:=False.
Hab hier vier Rechner zum Testen:
Läuft Frameunabhängig sauber mit gleichmäßiger Geschwindigkeit auf: Athlon XP 2400+ mit Windos XP Intel Dual Core mit Windows XP Laptop mit AMD Dual Core und Vista
Läuft nicht bei mir auf: Intel Quad Core mit Windows 7
Maus im Fenster, egal ob die Maus bewegt wird oder nicht. Die Frames bleiben gleich aber Bewegungen der Sprites kommen fast zum Stillstand. Muß ich wohl doch wieder mit GetTickCount steuern.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das selbe Problem hatte ich früher auch, und zwar nach einem Umstieg auf ne Mehrkern-CPU, und genau daran liegts auch. Stelle mal auf eine normale Renderschleife um (repeat...until), die du dann z.B. nach Anwendungsstart in einem einmalig gestartetn Timer loslaufen lässt. Das sollte auch auf Mehrkern-CPUs problemlos laufen. OnIdle sollte man also eher nicht mehr für eine Renderschleife nutzen. Probier aber vorher auch mal Application.ProcessMessages in deiner Schleife aus und schau obs was bringt. Aber wie gesagt kein OnIdle nutzen, sondern eigene Renderschleife.
Habs so gemacht und zum Rendern in ne While Schleife reingepackt und siehe da es funktioniert. Man lernt doch nie aus. Aber warum ist das eigentlich so auf Mehrkern CPUs? Was geht da vor sich dass es zu diesen Problemen kommt? Auf jeden Fall kann ich jetzt wieder beruhigt schlafen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ehm. Also was das betrifft hatte ich bei Mehrkernern keine Probleme. Die Probleme werden eher durch QueryPerformanceCounter verursacht, da der nicht bei allen Kernen den gleichen Wert haben muss. Warum das allerdings mit dem Mouse-Event zusammenhängt, weiss ich nicht. Für AMD gabs da dieses Tool, was das ganze gefixt hat (hatte nämlich auch mit einigen Spielen das Problem, dass die sehr merkwürdig liefen). Bei Intel weiss ich nicht.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Warum das so ist kann ich nicht genau sagen, aber ich denke es liegt daran dass deine Anwendungsthread von Windows zwischen den verschiedenen Kernen hin- und hergeschoben wird, ohne dass man direkt Einfluss darauf hat. Dadurch entstehen dann wohl auch Sprünge im Timing zwischen den CPU-Kerne, die dann die Problematik mit dem Timebased Movement erklären dürften.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Hallo Slave,
das Problem bei dieser Lösung ist, dass nur die Zeit für das Rendern und Swappen des Buffers gemessen wird. Alles was ausserhalb der "Schleife" geschieht fehlt. Ausserdem kann man sich einen Query sparen:
Code:
// Init (dort wo auch die Frequenz abgefragt wird.
Danke euch. Klappt jetzt alles soweit. Wenn ich jetzt noch Pixelkollision und Terrainkollision hinbekomme ist es fast perfekt. Haltet vorsichtshalber aber schon mal paar Antworten dazu parat wenn ich sollte scheitern. Bis bald
Mitglieder in diesem Forum: 0 Mitglieder und 19 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.