![]() |
Frame und Zeit-Regelung für Spiele
Hallo Allerseits,
Ich bin gerade dabei mich in dem Bereich 3d-Programmierung weiterzubilden. Nachdem ich anfangs einfach mit Timern gearbeitet habe bin ich jetzt aufgrund gewachsener Erfahrung auf die Methode mit Framecountern und TimeBased Movement umgestiegen. (Kurz erklärt: Den Computer in einer Endlosschleife so viele Frames generieren zu lassen wie er kann und dann abhängig von der Zeit die diese Frames zur Generierung benötigen die Objekte zu bewegen-->somit bekommt man eine zeitabhängige Geschwindigkeit und keine Frameabhängige) Dazu hätte ich jetzt eine Frage: Die höchste Zeitauflösung bekommt man unter Windows mit "QueryPerformanceCounter". Die ist ja auch wirklich mehr als genug, im Bereich von Mikrosekunden und so, aber selbst auf der Microsoft-Website wird gesagt das diese Abfrage abhängig vom (Hardware-)System sein kann und auf manchen Systemen gar nicht unterstützt wird (gibts z.B auf Windows Versionen vor NT gar nicht). Wenn nun aber die ganze Ablauf-Geschwindigkeit eines Spiels darauf basiert ist müssen sich durch diese Ungenauigkeiten doch auch Probleme in Spielen auf Windows (oder Linux -> da die Zeitmessung dort auch in Mikrosekunden mit gettimeofDay erfolgt) ergeben. Wenn zum Beispiel mein System besonders ungenaue Werte liefert müssten 3d-Shooter doch unterschiedlich schnell laufen. Oder wenn mein System solche Anfragen erst gar nicht unterstützt dürften Spiele eigentlich gar nicht laufen :gruebel: Gibt es da eine besonders professionelle Lösung von der ich nichts weiß und die allen von Profis genutzt wird? |
Re: Frame und Zeit-Regelung für Spiele
Die Ungenauigkeiten sollten nicht allzu groß sein. Achte vor allem darauf, dass du die Abfrage immer vom selben Kern aus ausführst. Wenn dir das nicht reicht, empfehle ich folgenden Artikel:
![]() Der geht relativ ausführlich auf die Möglichkeiten ein, und auch die Links dazu sind nicht zu verachten. Im Endeffekt macht es nichts, wenn das Spiel nach einiger Zeit eine kleine Abweichung hat, denn der Spieler wird sie sowieso nicht bemerken. Spielst du im Netzwerk, musst du hin und wieder eine Synchronisation durchführen, damit diese Drift-Bewegungen, wenn sie vorhanden sind, ausgeglichen werden. Das geht natürlich immer nur näherungsweise, aber damit fährt man am Ende ganz gut. Auf aktuellen Systemen (damit meine ich die, die so in Gebrauch sind) hast du eigentlich auch immer den PerformanceCounter zur Verfügung und er sollte auch recht genau sein. Nicht unbedingt die angegebenen Nanosekunden, aber genau genug, um eine Größenordnung von mehreren Millisekunden, wie du sie in Spielen hast, exakt abzumessen. |
Re: Frame und Zeit-Regelung für Spiele
Danke für die ausfuhrliche Antwort, ich hab das Problem anscheinend etwas überschätzt.
Der Link hat mir sehr weitergeholfen. Nur eine Kleine Frage: was meinst du mit "immer Abfrage vom selben Kern" ausführen? |
Re: Frame und Zeit-Regelung für Spiele
Auf Multicore-Prozessoren hat jeder kern seinen eigenen Performanccounter, sprich, die Werze sind nicht synchron. Wenn Windows deinen Prozess/Thread jetzt zwischen den kernen hin und herschiebt entstehen Ungenauigkeiten, die z.B. zu Rucklern führen können.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz