Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.04.2011, 16:32

Kapitel 1.2.4 - "Das Problem mit der Zeit" - Unsinn!

Ich hab grad angefangen das Buch zu lesen, bin aber schon nach ein paar Seiten hängen geblieben - nicht weil ich den Inhalt des Kapitels nicht verstanden hätte, sondern eher weil ich nicht verstehen konnte was so etwas in einem professionellem Buch zu suchen hat.

Ich weiß nicht ob darauf noch später eingegangen wird, aber auf die Gefahr hin das ich hier eine bereits bekannte Problematik anspreche:
Die Lösung die hier für die Zeitkontrolle genannt wird ist unheimlich naiv und enthält einige Logikfehler und andere Probleme die eigentlich nur einem Anfänger entgehen können:

1) Die Lösung erfordert das ständige zeitabhängige Umrechnen von Koordinaten - nicht sehr schön, und intuitiv schon gar nicht.
2) Auf langsamen Rechnern (und unter ungünstigen Bedingungen auch bei schnellen) können sehr schnell große Sprünge entstehen, was eine Kollisionserkennung mit dem a posteriori Ansatz komplett unbrauchbar macht.
3) Ressourcen werden unnötig verschwendet: Arbeitet ein Rechner zu schnell, werden völlig sinnloserweise zigtausende Berechnungen der Spiellogik durchgeführt, wenn es hundert oder weniger auch getan hätten.
4) Es wird von einem völlig unrealistischen Aufwandsverhältnis von Graphik- und Logikberechnungen ausgegangen - beiden wird hier die gleiche Gewichtung zugeordnet. Praktisch verbraucht das Berechnen von Graphiken jedoch viel mehr Ressourcen als die Logikberechnungen wie Bewegung oder Kollisionserkennung. Wenn man nicht gerade auf einem Commodore 64 arbeitet dürften die paar Berechnungen die die Logik benötigt locker unabhängig vom Rechner mehrere hundert mal pro Sekunde durchführbar sein, während das Berechnen von Graphiken ungleich aufwändiger ist und sich wahrscheinlich selbst auf einem schnellen Rechner nur ein paar dutzend mal pro Sekunde durchführen lässt (bei einer Szene die mehr als einen Würfel enthält versteht sich).

Nun hätte man das vielleicht noch durchgehen lassen können, wenn die wesentlich bessere Alternative tatsächlich schwieriger zu implementieren oder weniger einleuchtend wäre. Nur ist sie genau das nicht:

Man benutzt einfach einen Timer (unter Windows per SetTimer verfügbar), und führt die Logik vom WM_TIMER handler aus aus, ruft falls nötig InvalidateRect nach dem Logikdurchlauf auf, das Rendern wird dann im WM_PAINT handler erledigt. Im Prinzip wars das schon. Natürlich hinken hier Rechner die mehr Zeit für die Berechnung eines logischen Frames brauchen als die angestrebte logische Framerate es erfordert hinterher - aber dafür gibt es auch eine recht pragmatische Lösung: Man holt sich einen neueren Rechner. Niemand erwartet das Crysis auf einem Apple II läuft, und auf derartig langsamen Rechnern würde die im Buch vorgestellte Methode ebenfalls nicht zu einem befriedigendem Spielerlebnis führen. Angestrebt werden hierbei 60-100 logische Frames pro Sekunde, die muss der Rechner halt schaffen, Bildberechnungen werden maximal mit dieser Framerate ausgeführt und ansonsten eben so oft wie der Rechner es hinkriegt. Man hat hier weder das Problem das Charaktere auf langsamen Rechnern einfach durch Wände laufen, noch unnütze Berechnungszyklen auf schnellen Rechnern. Nebenbei spart man sich die Zeitumrechnungen im Quellcode und das Zeitproblem an sich ist auch gelöst.


Sollte irgendjemandem Gründe einfallen die gegen diese Methode bzw. für die im Buch sprechen, kann er sie hier gerne vor bringen.

PS: Bevor mir jemand damit ankommt: Sollte man extrem komplexe Logikberechnungen durchführen müssen die sich beim besten Willen nicht so oft innerhalb einer Sekunde unterbringen lassen wie der Rest der Logik, so kann er den Teil einfach abkapseln und weniger oft (zB. nur jeden dritten Frame oder so) ausführen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

11.04.2011, 16:38

willkommen im forum.
schau dir mal kapitel 9.14 an. dort wird darauf hingewiesen.
hier im forum gibts auch einen thread in dem das schon ausführlich diskutiert wurde.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

11.04.2011, 16:53

Wie gesagt, ich hab das Buch grad erst angefangen. Ist mir bloß gleich zu Anfang ins Auge gestochen. Und Gruß zurück ;)

4

20.04.2011, 21:37

Hi,

mich hat das Thema auch schon immer interessiert. Da ich die Logik des WM_TIMERS nur ungenau kenne, habe ich eine Frage dazu:

Wenn ein Rechner für einen Moment von einem anderen Prozess kurz stark ausgelastet wurde und deswegen kurzzeitig die Logik (also Physik) langsamer berechnete als sonst, heißt dass dann, dass sich z.B. der Spieler kurzzeitig langsamer bewegt? So kenne ich das zumindest aus Blitz3D, wo man nie um zeitbasierte Frames herumkam, da sonst das genannte passierte und Multiplayerspiele unbrauchbar machte.

Gruß,
PacMani

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Pac-Man« (21.04.2011, 00:36)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

20.04.2011, 23:11

Was hat dein Normalize mit dem Thread zutun? Du meinst wohl deinen anderen Thread;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

6

21.04.2011, 00:36

Huch! Danke. Hatte mich schon gewundert, wo das abblieb... :cursing:

Werbeanzeige