Ich versuche, eine Multithread-Spielschleife zu implementieren. Ich habe das schon gemacht, musste dafür aber ein paar Schlösser verwenden, was die Leistung ruinierte. Nachdem ich ein bisschen recherchiert hatte, kam mir diese Idee:
Anstatt die Engine-Subsysteme in verschiedene Threads (z. B. Physik, Animation) aufzuteilen, werden alle Subsysteme auf allen Threads ausgeführt. Wenn wir also vier CPUs haben, werden vier Threads erstellt, wobei jeder Thread eine Schleife für alle Subsysteme hat. Die Single-Core-Spieleschleife wird also auf alle vier Threads kopiert. Diese Spielschleifen werden von einer anderen Schleife gesteuert, die Nachrichten (oder "Jobs", "Aufgaben") gemäß Benutzereingaben oder Skripten an einen dieser Threads (abhängig von ihrer Verwendung) sendet. Dies könnte mit einem doppelt gepufferten Befehlspuffer erfolgen.
Für maximale Renderleistung befindet sich nur die Rendering-Schleife in einem Thread. Jetzt denke ich über den besten Weg nach, um mit der Rendering-Schleife zu kommunizieren. Die beste Idee, die ich mir einfallen lassen könnte, ist, wieder einen Befehlspuffer zu verwenden und ihn auszutauschen, wenn die Rendering-Schleife abgeschlossen ist. Auf diese Weise muss die Rendering-Schleife nicht auf eine der Schleifen warten und kann weiter gerendert werden. Wenn die Spielschleife nicht beendet wurde, als die Rendering-Schleife den Puffer ausgetauscht hat, werden alle Befehle danach im nächsten Frame der Rendering-Schleife ausgeführt. Um sicherzustellen, dass alle Objekte gezeichnet werden, auch wenn die Spielschleife noch nicht beendet ist, enthält die Rendering-Schleife alle Objekte, die gezeichnet werden, und zeichnet sie, bis der Befehl zum Beenden des Zeichnens eingeht.
Mein Ziel ist es, die Engine auf CPU-Zahlen skalierbar zu machen und alle Kerne zu verwenden. Ist das ein Weg das zu tun? Was ist der beste Ansatz dafür und wie gehen moderne Motoren damit um?