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

Aktuelle Zeit: Mi Jun 26, 2024 06:25

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jan 29, 2010 08:58 
Offline
DGL Member

Registriert: Sa Nov 29, 2008 22:31
Beiträge: 18
Hallo ich bins mal wieder

Ja ich bin auch fleißig mit Delphi auch wenn man das nicht denkt. :P 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

Code:
  1.  
  2. QueryPerformanceCounter(QPCStartCount);
  3.  
  4.  Render;
  5.  SwapBuffers(DC);
  6.  
  7. QueryPerformanceCounter(QPCEndCount);
  8. TimeFactor := (QPCEndCount-QPCStartCount)/PerfCounterFreq*100;
  9.  


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


Zuletzt geändert von Frase am Sa Jan 30, 2010 20:09, insgesamt 1-mal geändert.
[Gelöst] hinzugefügt :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 09:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
http://www.delphigl.com/forum/viewtopic.php?f=10&t=8575&p=72870&hilit=Timebased+movement#p72870

ist zwar nicht ganz das gleiche Problem, aber vielleicht hilft das.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 09:37 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
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 ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 11:55 
Offline
DGL Member

Registriert: Sa Nov 29, 2008 22:31
Beiträge: 18
Erstmal Danke an euch für die Hinweise aber es geht nicht mehr. Ja ich benutze OnIdle zum Rendern und Done:=False. :P

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 12:20 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 16:45 
Offline
DGL Member

Registriert: Sa Nov 29, 2008 22:31
Beiträge: 18
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. :)

Vielen Dank


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 17:16 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 17:18 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 18:56 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Ich schätze man kanns auch umgehen, indem man einen Thread an einen Prozessor bindet oder einen Prozessor vorschlägt. Probiert hab ichs aber nicht.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 03:21 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. // Init (dort wo auch die Frequenz abgefragt wird.
  3. QueryPerformanceCounter(QPCStartCount);
  4.  
  5.  
  6. // Schleife
  7.  Render;
  8.  SwapBuffers(DC);
  9.  
  10. QueryPerformanceCounter(QPCEndCount);
  11. TimeFactor := (QPCEndCount-QPCStartCount)/PerfCounterFreq*100;
  12. QPCStartCount := QPCEndCount;
  13.  


Bin mir jetzt gerade nicht mehr sicher. Aber muss man die Frequenz nicht mit 1000 multiplizieren?

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 19:07 
Offline
DGL Member

Registriert: Sa Nov 29, 2008 22:31
Beiträge: 18
Danke euch. :D
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.023s | 18 Queries | GZIP : On ]