Warum ist Draw und Update getrennt?

Hin und wieder wird gefragt, warum die Update- und Draw-Methoden der Game-Klasse unterteilt sind und warum nicht beide einfach in einer Methode stehen, da dies doch übersichtlicher sei. Selbstverständlich hat dies einen guten Grund, der aber nicht unbedingt immer sofort ersichtlich ist.

Beide Methoden haben unterschiedliche Aufgaben, die durch den Namen bereits ganz gut beschrieben werden. Die eine aktualisiert die Spielwelt (Update) und die andere zeichnet die Spielwelt (Draw).

Grundsätzlich sollte man meinen, daß die GameLoop der Game-Klasse einfach eine Endlosschleife ist, in der Update und Draw einfach nacheinander aufgerufen werden. Das ist zwar grundsätzlich richtig, aber ganz so einfach ist es dann auch wieder nicht.

Die Häufigkeit des Aufrufs von Update wird durch die Eigenschaft TargetElapsedTime der Game-Klasse festgelegt. Der Standard ist hierbei 1/60stel Sekunde, also 60 mal pro Sekunde. Die Game-Klasse wartet also, bis TargetElapsedTime erreicht ist und ruft dann die Update-Methode auf. Der übergebene Parameter GameTime gibt dabei die Zeit an, die seit dem letzten Update-Aufruf verstrichen ist.

Danach wird die Draw-Methode aufgerufen, aber nur, wenn die Zeit für einen erneuten Update-Aufruf noch nicht erreicht wurde. Dies kann passieren, wenn die Update-Methode länger als die TargetElapsedTime dauert. In diesem Fall wird IsRunningSlowly auf true gesetzt, damit man auf diesen Umstand reagieren kann.

Die Draw-Methode wird zusätzlich noch durch die Eigenschaft SynchronizeWithVerticalRetrace beeinflusst. Wird diese Eigenschaft auf true gesetzt, was der Standard ist, so wird vor dem eigentlichen Rendern auf den sogenannten Vertical-Retrace gewartet. Dies ist ein technischer Vorgang aus der Monitortechnik bei Röhrenmonitoren, bei der der Rasterelektronenstrahl von der letzten Bildposition zurück zur ersten Bildposition gesprungen ist. Bei modernen TFT-Bildschirmen ist dies aber eher mit der Bildwiederholfrequenz gleichzusetzen.

Im Grunde genommen macht es fast immer Sinn mit dem VSync zu synchronisieren, da der Monitor einfach nicht mehr Bilder pro Sekunde darstellt. Warum sollte man dann auch Rechenzeit verschwenden und mehr Bilder rendern?

Advertisements

Veröffentlicht am 30.12.2009, in Grundlagen, XNA, XNA 3.1. Setze ein Lesezeichen auf den Permalink. Ein Kommentar.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: