Problem mit Timebased Movement [DEMO auf Seite 3]

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Problem mit Timebased Movement [DEMO auf Seite 3]

Beitrag von ZeHa »

Hallo!

Ich sehne mich nach festen FrameRates und gleich schnellen Computern ;)
Aber da das leider nicht mehr möglich ist, ist man ja fast schon gezwungen, Timebased Movement zu verwenden. Nur hab ich dadurch ein erhebliches Problem.

Und zwar schwankt bei mir die Zahl der Pixel, die die Figur laufen soll, sehr stark, in meinem Fall meist zwischen 4,8 und 5,2.

Dadurch ruckelt mein Spiel ziemlich. Ich dachte immer, es liegt an der Kommazahl (da es mit glatten Zahlen wie "5 Pixel" super lief), aber auch mit einer konstanten Zahl wie 4,784 ist es gut. Nur dürfte es dann halt nicht schwanken.

Hab auch schon mehrere Dinge versucht, beispielsweise immer 10x die Zeit zu speichern und daraus dann den Mittelwert errechnen. Dadurch kann ich die Schwankung zwar minimieren, aber sie ist einfach immer noch da.

Eine andere Möglichkeit wär natürlich, zu Beginn des Spiels einen kurzen Test zu machen (die ersten 50 Frames oder so), ebenfalls Mittelwert errechnen und den dann konstant nehmen fürs ganze Spiel. Ist aber auch nicht optimal, da es ja sein kann, daß in dem Moment, wo getestet wird, im Hintergrund grad 'ne eMail abgerufen wird oder sonstwas. Und schon läuft das Spiel für den Rest der Spieldauer arschlahm.

Was mich tröstet, ist, daß es auf anderen Computern wesentlich besser läuft, sprich, die Schwankung liegt vielleicht im Hundertstelbereich. Aber auch das find ich nicht sooo super, natürlich auch gerade deswegen, weil ich ja nicht einschätzen kann, ob das für alle anderen Computer auch gilt...

Hat jemand schonmal ein ähnliches Problem gehabt und das irgendwie gelöst?
Zuletzt geändert von ZeHa am 25.10.2005 15:21, insgesamt 1-mal geändert.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

ich hatte mal ein ähnliches problem. es hat sich erstaunlicherweise durch neupositionieren der einzelnen abläufe und insbesondere von flipbuffers() erledigt. ich habe leider das programm nicht mehr, aber bei mir war glaube ich die lösung, dass flipbuffers vor meinem restlichen code ausgeführt wurde und dann hatte es plötzlich nichtmehr geruckelt.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Also, wenn dein System 100% richtig funktioniert, dann entstehen ruckler dadurch, das dein PC zu langsam ist, oder dein Spiel ist nicht optimiert genug. ... aber das sieht man ja an Frames.

Da du hier keinen Code zeigst, wie du so was machst, kann man ja nur vermuten. ...

Ein Fehler kann sein, das du keine Floats verwendest. Die Koordinaten für deine Figur müssen in Floats gespeichert werden, damit auch bei kleineren Einheiten sich deine Figur überhaupt bewegt. Vielleicht hast du irgend eine Variable nicht als Float und hier durch werden die Kommerzahlen abgeschnitten, wodurch solch ein Ruckeln entstehen kann.

Ansonnsten, wenn nichts von alle dem zutrifft ist irgend woanders ein Fehler ... oder du bist zu empfindlich und versteht unter ruckler was anderes :wink: (gibs ja auch)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Also mein Rechner ist sehr alt, 666 MHz. Hört sich zwar teuflisch gut an, ist aber arschlahm. Klar, nun kann ich vermuten bzw. hoffen, daß es wirklich nur daran liegt. Aber andererseits kann ich es nicht einfach auf 5 anderen Rechnern testen, mich freuen und dann hoffen, daß es auf allen anderen dieser Welt genauso geil läuft ;)

Code posten ist auch schwierig, da das Projekt mittlerweile schon recht umfangreich ist. Ich benutze aber Floats, also solcherlei Fehler dürften sich nicht eingeschlichen haben ;)

Die GameLoop kann ich euch zeigen, der ist schön kompakt:

Code: Alles auswählen

Repeat
  Display()
  If VSync
    FlipBuffers(0)
  Else
    FlipBuffers(1)
  EndIf
  If FullscreenMode=0
    WindowEvent()
  EndIf
  Controls()
  Player()
  Objects()
  Delay(1)
Forever
Sprich, es wird zuerst alles aufgemalt, dann werden die Buffers geflippt. Und erst danach kommt der restliche Teil mit Tastatur etc...

Naja also es ist echt nicht einfach... ich denk, ich werd mal demnächst 'ne Demo posten, dann kann mir jeder mal seine Ruckel-Erlebnisse mitteilen ;) dauert aber noch ein Weilchen...
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Delay(1) bei spielen? :shock: ...
überleg mal Doom 3 oder was so hätten in der Hauptschleife ein Delay() drinne :wink: ...
Ist doch ein Spiel, oder?
Naja wie auch immer ... das Delay(1) würd ich allerdings direkt hinter FlipBuffers() setzten, denn so zeigst du so zu sagen die vergangenheit an :wink: .

-> du berechnest alles
-> wartest
-> stellst alles dar

^^Naja, 666 Mhz sind doppelt so viel, wie mein alter rechner hat :wink: ... aber das ist zum glück der alte :mrgreen: .
Wie auch immer, es ist eigentlich ganz einfach, herraus zu bekommen, ob die Rukler am Code liegen, oder ob der PC zu langsam ist. Lass dir doch einfach die FPS anzeigen. Wenn die so über 30 sind dann sollte der PC schnell genug sein ... wobei 30 FPS eigentlich auch ziemlich wenig ist für viele :lol: , aber rukel werden erst wirklich gravierend, wenn die FPS unter 20 oder gar im einstelligen Bereich sind :wink: .

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Das Delay(1) hab ich eigentlich nur eingebaut um die CPU-Auslastung nicht so hoch zu haben... wenn ich es allerdings woanders hin schiebe, merke ich dadurch auch keinen Unterschied. Auch wenn ich es ganz weglasse, verbessert es sich nicht.

Ja, es ist ein Spiel ;) FPS hab ich mir auch schon anzeigen lassen, die liegen bei mir meist bei ca. 85...
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Mach mal Delay(0) drauß. Das dauert keine 1 Millisekunde lang, ist aber dennoch CPU-schonend.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Danke für den Tip ;)
Für das Spiel bringt's zwar nix, aber trotzdem gut zu wissen.

Zum Spiel selbst fällt mir noch ein... ich hab mir mal die Zeiten pro Frame ausgeben lassen... das schwankt eben immer zwischen 9 und 15 ms. Liegt das nun am PC oder an was könnte das liegen?

Ein Kumpel von mir meinte, evtl. liegt's auch an Win 2000, weil dort der Zeitmesser nicht millisekundengenau, sondern nur hundertstelsekundengenau arbeitet oder so... wobei dann aber die oben genannten Werte ja eigentlich auch nicht sein könnten, oder? Dann müßten es ja immer 10 oder 20 ms sein...
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Also bei 85 FPS gibt es keine rukler ...

das mit den MS stimmt ... das liegt aber nicht an Win2000 sonndern ist glaub ich bei allen Betriebssystemen so. Zumindest bei den Windows Versionen. Wenn du eine ganz genaue Zeitabfrage benötigst, dann such mal im Forum ... TimeGetTime heißt glaub ich der Win-API befehl ... aber da gehört noch mehr zu ... naja wie auch immer

Für ein spiel ist das aber eher nicht nötig. Die normale Zeitermittlung mit GetTickCount bzw dem PB-Befehl ist so 10-20 ms genau ... das reicht normal. Dein Problem dürfte dann intern irgend wo sein. Falsche Anwendung, Rechenfehler ... logikfehler ... gibt ja genug möglichkeiten :D . Vielleicht sinds auch die Summe von ganz kleinen Unstimmigkeiten, die am ende dieses Ergebnis liefern.

Aja und 10 ms pro Durchlauf sind ja gute 100 FPS ... also kein Problem ... selbst die 15 ms sind immer noch über 66 FPS ...

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Naja vielleicht verstehst Du das Wort "Ruckler" anders als ich... ich meine es halt so, wenn die Figur mal 4,7 Pixel und mal 5,2 Pixel weit läuft, und das in jedem Frame wechselt, dann ist es ja klar, daß es nicht schön smooth läuft sondern eben entsprechend "ruckelig"... und das ist eben das Problem. Ich muß es irgendwie hinkriegen, daß diese Schwankung nicht auftritt...
Antworten