Frage

Ich verstehe, warum es das tut, aber ich habe nicht wirklich eine Ahnung davon, wie das zu verhindern. So das Szenario ist, bewegen sich in jedem Frame ich das Auto von einem bestimmten vordefinierten Pixel. Was passiert, ist, wenn ich auf langsam oder schnellen Computer gehen ... na ja ich weniger oder mehr Bilder pro Sekunde, damit das Auto entweder langsamer oder schneller bewegt. Ich habe mich gefragt, wie ich das verhindern könnte.

Ich vermute, dass ich das gleiche Problem mit einem beliebigen Bibliothek haben würde ... Das ist mein erstes Mal in Echtzeit Sachen wie das zu tun.

War es hilfreich?

Lösung

Ich vermute, dass Ihr aktueller Code irgendwie wie folgt aussieht

 // to be called every frame
 void OnEveryFrame()
 {
     MoveCar();
     DrawCarToScreen();
 }

Aber es sollte so aussehen:

 // to be called - for example - 50 times per second:
 void OnEveryTimerEvent()
 {
     MoveCar();
 }

 // to be called every frame
 void OnEveryFrame()
 {
     LockTimerEvents();
     DrawCarToScreen();
     UnlockAndProcessOutstandingTimerEvents();
 }

Sie haben ein entsprechendes Timer-Ereignis einzurichten, natürlich.

Andere Tipps

Verschieben Auto nach Timer und nicht Framerate. das heißt Automodell der Anzeigedarstellung unabhängig sein sollte.

Sie können dies lösen, indem sie präzise Timer und Vektor-Mathematik verwendet wird.

So

, für die Zwecke der Beweisführung läßt Ihren Zeichencode vorschlagen könnte zu jedem Zeitpunkt aufgerufen werden, z.B. 1 Sekunde auseinander oder 3 Sekunden auseinander oder 0,02 Sekunden auseinander liegen.

Nehmen Sie die Auto Bewegungsgeschwindigkeit 40 Pixel eines zweiten zu sein.

Daher sollte die Anzahl der Pixel, es bewegen ist. (TIME_NOW - LAST_FRAME_TIME) * 40px

Die Bewegung sollte durch eine „echte“ Zeitverzögerung gezwungen werden, das heißt Sie Auto mit einer Geschwindigkeit von x Pixel pro Zeitscheibe bewegen wird.

Lesen Sie die Echtzeit-Uhr und bewegen das Auto einen geeigneten Abstand für die verstrichene Zeit. Dies kann etwas „ruckartig“ aussehen, wenn der Computer zu langsam ist, aber macht die Fahrzeuggeschwindigkeit unabhängig von der CPU-Geschwindigkeit.

Sie müssen die Framerate X Frames pro Sekunde begrenzen (60 FPS ist die häufigste). Dies ist ein gemeinsames Merkmal in den meisten Multimedia-Framework, einschließlich SFML. Für SFML würde ich das Fenster / RenderWindow Methode schauen Sie in SetFramerateLimit (unsigned int Limit) .

Sie müssen Ihren Zeitschritt zu beheben. Grundsätzlich Sie jeden Rahmen das Auto bewegen, um eine Distanz, die, wie viel Zeit variiert basierend seit dem letzten Update Anruf tatsächlich abgelaufen ist. Auf diese Weise erhalten Sie die richtige Geschwindigkeit unabhängig von Framerate.

Sie haben die Zeit zu retten, bevor Auto und Zeichnungen zu bewegen.
Speichern Sie die Zeit nach allen Berechnungen.
Bewegen Sie Ihr Auto von Npixels / Sekunde

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top