Frage

Ich habe einen (grundlegenden) Voxel-Motor laufend und ein Wassersystem, das aussieht (und ich nehme grundsätzlich arbeitet) so: https://www.youtube.com/watch?v=q_tdegioots (nicht mein Spiel). Kummer Die Wasserwerte werden in einem 3D-Array von Floats gespeichert, und alle 0,05s berechnet den Wasserstrom, indem das untenstehende Voxel und benachbart (Y-1, X-1, X + 1, Z-1, Z + 1) überprüft wird der Wert. Kummer Dieses System funktioniert gut (70+ fps) für kleine Wassermengen, aber wenn ich anfange, Wasser auf 8+ Chunks zu berechnen, wird es zu viel. (Ich deaktivierte alle Rendering- oder Mesh-Erstellung, um zu überprüfen, ob dies der Engpass ist, ist es nicht. Es sind nur die Strömungsberechnungen). Kummer Ich bin kein sehr erfahrener Programmierer, also würde ich nicht wissen, wo ich mit der Optimierung beginnen soll, abgesehen davon, dass die Berechnungen in einer Coroutine erfolgen, wie ich bereits getan habe. Kummer In diesem Beitrag: https://gamedev.steckexchange.com/questions/ 55414 / How-to-Definition-Bereich-Bereiche-mit Wasser (in der Nähe des Bodens) Boreal schlägt vor, es in einem Berechnung Shader zu leiten. Ist das der Weg, für mich zu gehen? Und wie würde ich so etwas umgehen? Kummer Jede Hilfe wird sehr geschätzt.

War es hilfreich?

Lösung

Wenn Sie wirklich eine Voxel-basierte Simulation berechnen, erweitern Sie die Anzahl der Berechnungen, die geometrisch, da Ihre Größe erhöht wird, sodass Sie die Verarbeitungsleistung auf größeren Volumina schnell ausgehen.

A Crete Shader ist großartig, um massiv parallele Berechnungen zu tätigen, obwohl es ein ganz anderes Programmierparadigma ist, das einige gewöhnungsbedürftig ist. Ein Compute-Shader wird den Inhalt eines Puffers (dh eine "Textur" für US-Zivilisten) ansehen und es sehr schnell dagegen tun - in Ihrem Fall wird der Puffer wahrscheinlich ein Puffer / Textur sein, dessen Pixelwerte Wasserzellen darstellen. Wenn Sie etwas wirklich einfaches tun möchten, z. B. inkrementieren Sie sie nach oben oder unten, nutzt der Compute-Shader die parallele Verarbeitungskraft der GPU, um es wirklich schnell zu tun.

Der harte Teil ist, dass GPUs für die parallele Verarbeitung optimiert. Dies bedeutet, dass Sie keinen Code wie "texela.value += texelb.value" schreiben können - ohne zusätzliche Arbeit an Ihrer Seite, jedes Fragment des Puffers wird mit Nullkenntnissen über das, was in den anderen Fragmenten geschieht, verarbeitet. Um andere Texels zu verweisen, müssen Sie die Textur irgendwie wieder lesen - einige Techniken lesen eine Textur mehrmals mit Offsets ( Dieses GL-Beispiel macht dies zum Implementieren von Unschärfen, andere tun es, indem sie wiederholt eine Textur verarbeiten, indem sie das Ergebnis in eine temporäre Textur einsetzen und das dann wieder aufbereitet.

Auf der 10.000 Fuß-Ebene: Ja, ein Compute-Shader ist ein gutes Werkzeug für dieses Problem, da es um Tonnen von selbst ähnlicher Berechnung beinhaltet. Aber es ist nicht einfach, den Fledermaus auszuführen. Wenn Sie vorher keine herkömmliche Shader-Programmierung gemacht haben, möchten Sie sich möglicherweise zuerst ansehen, um sich an die Art und Weise, wie GPUs-Arbeit verwendet wird. Sogar wirklich grundlegende Werkzeuge (if-then-and-and-Loops) haben sehr unterschiedliche Leistungsauswirkungen und Verwendungen in der GPU-Programmierung und dauert einige Zeit, um den Kopf um die Unterschiede zu bringen. Ab diesem Schreiben (1/10/13) sieht es aus wie nvidia and athacity bietet einen Intro, um zu berechnen Shader-Kurs , der ein guter Weg sein könnte, um auf den neuesten Stand zu sein.

fwiw Sie benötigen auch ziemlich moderne Hardware für Berechnungsschirme, die Ihr Publikum einschränken können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top