Seite 7 von 7

Re: framerate-unabhängige GameLoop

Verfasst: 13.09.2011 12:55
von ZeHa
du siehst, das Verhältnis zwischen Rendering und dem Rest ist ein etwas anderes.
Naja, Du schreibst die "Logik" braucht zwischen 0,1 und 1,2 ms und das Rendern braucht zwischen 4 und 10 ms. Das kommt meinem salopp dahergesagten 90:10 schon recht nahe ;) zumindest nahe genug, daß es sich bei Dir nicht um einen völlig anderen Fall handelt - z.B. daß beides ungefähr gleich lang benötigt oder daß das Updaten sogar mal länger braucht, etc. Von daher wundere ich mich immer noch etwas über die FPS-Verdoppelung :)

Re: framerate-unabhängige GameLoop

Verfasst: 13.09.2011 19:47
von PMV
Öhm, ich hab da ja auch die "normalen" Situationen gemeint. Die Verdoppelung
tritt natürlich erst in Kraft, wenn super viel los ist und der Logikthread selber bei
mehr als 10ms hängt (oder weit darüber hinaus). Genaue Werte kann ich aber nicht
dafür geben, da es durch die Segmentierung der Karte bereits abhängig ist,
wie viele Objekte nahe beieinander sind. Spitzenwerte von 1600 hab ich erreicht,
wo der Logikthread bei 50ms und mehr war. Und auch 1400 Objekte mit lediglich
25ms für den Logikthread. Das eine mal, wo ich es dann mal mit einem Mainthread
probiert hab, waren es bei 1400 Objekte mal 50ms. Wegen starken Schwankungen
unspielbar, während die Threaded Version steuerbar bleibt, FPS nach wie vor hoch,
lediglich die Objekte gleiten nicht mehr so sauber durch die Karte.

Einfache Rechnung, die jetzt mal nur Theorie ist. RenderWorld() braucht 6ms, wenn
etwas auf der Karte los ist. Um 60 FPS hin zu kriegen darf alles zusammen
nicht länger als 16.7 ms benötigen. Das sind 10.7ms, die für alles andere da sind.
Ab ~150 Objekte steigt die benötigte Rechenleistung stark an, bei 500 Objekten sind
die 10-11ms erreicht. Durch Schwankungen sind also bei 500 Objekten bereits keine
60 FPS gewährleistet. Wird es noch mehr, fällt die FPS rapide. Da bei mehr Objekten
aber auch RenderWorld() länger braucht, sind es wesentlich weniger als 500 Objekte,
die bei einem einzelnen Mainthread mit vollen FPS dargestellt werden können. Durch
einen 2. Core spielt es keine Rolle mehr, wie lang RenderWorld() braucht, so lange
es unter 16ms sind. Dadurch kann auch der Logikthread locker bis 17ms hoch gehen,
ohne das überhaupt etwas spührbar wird. Und das Ergebnis ist tatsächlich so in
der Praxis schon eingetreten: Grafikthread 12ms, Logikthread 20ms :wink:

Die FPS-Verdoppelung ist also nicht nur einfach ein Wert *2 ... sondern die Aussage,
das wo bei einem einzelnen Hauptthread bereits kein Spielspaß mehr aufkommt,
ist mit Multithreading nun alles flüssig und reagiert sofort.

MFG PMV