Multi-Threaded-Spiel - Aktualisieren, Rendern und Teilen


8

Aus dem StackOverflow-Beitrag (es wurde empfohlen, dies zu verschieben):

Also arbeite ich an einer Spiel-Engine und habe ziemlich gute Fortschritte gemacht. Meine Engine ist jedoch Single-Threaded, und die Vorteile der Aufteilung von Aktualisierung und Rendering in separate Threads klingen nach einer sehr guten Idee.

Wie soll ich das machen? Single-Threaded-Game-Engines sind (konzeptionell) sehr einfach zu erstellen. Sie haben eine Schleife, in der Sie aktualisieren -> rendern -> schlafen -> wiederholen. Ich kann mir jedoch keinen guten Weg vorstellen, um das Aktualisieren und Rendern auseinanderzubrechen, insbesondere wenn ich die Aktualisierungsraten ändere (sagen wir, ich gehe 25x pro Sekunde durch die Aktualisierungsschleife und habe 60fps zum Rendern) - was ist, wenn ich mit der Aktualisierung auf halbem Weg beginne? durch eine Renderschleife oder umgekehrt?


Antworten:


6

Sie sollten alle zum Rendern erforderlichen Daten, die im Aktualisierungsdurchlauf geändert werden, doppelt / dreifach puffern. Auf diese Weise rendern Sie nicht mit etwas, das teilweise geändert wurde. Der Grund, warum Sie wahrscheinlich den Puffer verdreifachen müssen, ist 1) die Kopie, die Sie aktualisieren, 2) die letzte Kopie, die Sie vollständig aktualisiert haben, und 3) die Kopie, die derzeit zum Rendern verwendet wird und die Sie nicht ändern möchten .

Am schwierigsten ist es wahrscheinlich, den besten Weg zu finden, um Ihre Daten dafür zu organisieren.


4

Diese Website diskutiert das Problem und hat eine Triple-Buffer-Lösung implementiert, wie Roger vorgeschlagen hat:

http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part1/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part2/ http: // blog. slapware.eu/game-engine/programming/multithreaded-renderloop-part3/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part4/

Es ist ziemlich schwierig zu implementieren, aber die Website hat sowohl eine Quell- als auch eine Binärverteilung der Implementierung, wenn Sie interessiert sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.