Threads ein Muß?
-
Hi!
Sollte ich in einem Spiel, die verschiedenen Bereiche (Rendering, Kollision, Physik, KI) in Threads organisieren?
Also ein Thread fürs Rendern usw.
Dann könnte der Renderthread durchlaufen während der Kollisions/Physikthread
rechnet und anschließend der KI-Thread darauf reagiert?Was ich erreichen möchte, ist, dass CPU und Graka nicht aufeinander warten
müssen und beide immer was zu tun haben.[ Dieser Beitrag wurde am 11.06.2003 um 14:42 Uhr von Kane editiert. ]
-
normalerweise stopft sich der treiber deiner graka einen buffer voll und wenn du nicht total was komisches machst (z.B. 20 millionen poyls per frame einzeln durchschicken), dann merkst du das nicht und wann immer die grafikkarte fertig ist mit ihrem momentanem rendern, ruft sie den treiber auf, der ihr die gebufferten aufrufe übergibt.
dinge wie z.B. 64MB texturen werden nicht gebuffert, sondern eher nur kleine dinge wie z.B. aufrufe fürs objektrendern, deswegen solltest du versuchen den verschleiß der dabei entsteht, wenn graka&cpu synchron laufen müssen, zu vermeiden.
dass die graka buffert kannst du feststellen, indem du nur einen einzigen durchlauf deines renderns machst, dann sollte so gut wie keine zeit vergangen sein, weil eben alles nur in den cache geschoben wurde.
sicherlich, wenn der buffer voll ist, wartet dein programm, wenn der buffer leer ist, wartet die graka, aber das passiert wohl auch mit threads, denn was willst du schon in die graka schieben, wenn die KI noch nichts ausgerechnet hat und das bild sich nicht änderte?
my2cent: threads sind eigentlich nur verschleiß, auch wenn manche das für ihre sonderfälle anders behaupten.
rapso->greets();
-
Also sieht der optimale Gameloop so aus:
Rendern();
Flush();
Kollision();
KI();
BufferSwap();Flush() habe ich von glFlush abgeleitet. Soll nur sagen, dass die
Buffer geleert werden, die Graka also garantiert mit Rendern anfängt.
Wenn ich dann mit der KI etc. fertig bin, ist im Idealfall die
Graka soweit, dass man den Buffer swappen kann.
Wenn das nicht so ist blockt ja BufferSwap solange bis alles fertig ist.
In der Zeit könnte ein KI/Kollision-Thread doch schon den nächsten Frame ausrechen? Ok, wenn er damit fertig ist, MUSS er auf den Bufferswap warten,
aber kann man so nicht die Framerate stabilisieren?
-
Zum Framerate stabilisieren naja - würd ich eher auf nen guten Timer setzen.
Und den Flush, führst du entweder vor dem Swap aus, oder läßt das den Swap selbst erledigen. So hat OpenGL mehr Zeit zum Rendern. Bei gewünschter Synchronität zwischen Rendern und anderen Sachen - schau dir mal z.B. Nvidia´s glFence an!
Ach ja - Flush sagt nicht aus, daß er anfängt zu Rendern, sondern der wartet bis die Graka feddich ist
[ Dieser Beitrag wurde am 11.06.2003 um 22:06 Uhr von SnorreDev editiert. ]
-
Ach ja - Flush sagt nicht aus, daß er anfängt zu Rendern, sondern der wartet bis die Graka feddich ist
Nein, das wäre glFinish.
Aus der MAN-Page von glFlush:
glFlush can return at any time. It does not wait until
the execution of all previously issued GL commands is com
plete.Insofern ist es für die Graka ein garanierter Startschuß
um mit Rendern anzufangen (falls sie das vorher noch nicht gemacht
hat)