Wie implementiere ich Fog of War effizient in einem Echtzeit-Strategiespiel?

7

Wie wird Nebel des Krieges in RTS-Spielen wie StarCraft II oder Age of Empires implementiert ? Ich mache ein RTS und plane, dass jede Einheit auf dem Feld eine Kreissicht bis zu einem bestimmten Radius hat.

Mein erster Gedanke war, eine Maske zu haben, die für jeden Punkt schwarz ist, außer für Punkte in der Nähe von Einheiten, wo sie transparent ist. Der Maskierungsvorgang selbst ist in den meisten Grafik-APIs schnell (z. B. einfach einen Shader aufrufenmix ). Der schwierige Teil besteht darin, herauszufinden, welche Maske verwendet werden soll und wie sie aktualisiert werden soll: Die Aktualisierung, wenn sich eine Einheit bewegt, ist sehr prozessorlastig.

Gibt es eine einfachere Möglichkeit, diese Art von Kriegsnebel zu bewältigen?

ChemiCalChems
quelle

Antworten:

5

Wenn Ihr Spiel zellbasiert belegt ist, können Sie den Nebel der Kriegsberechnungen reduzieren, indem Sie die Daten auf die Momente beschränken, in denen eine Einheit den Schwellenwert von einer Zelle zur nächsten überschreitet.

Pikalek
quelle
Ja, ich habe gerade darüber nachgedacht. Ich kann quadratische Zellen in meinem Spielfeld haben, sagen wir 128x128 oder so ähnlich. Ich könnte 3 Zellzustände haben, vollständig gesehen, nicht gesehen und teilweise gesehen. Das könnte klappen.
ChemiCalChems
9

Die folgende Antwort basiert auf eigenen RTS-Erfahrungen, die visuell mit Age Of Empires und anderen RTS-Spielen übereinstimmen

Heutzutage gibt es nicht einen, sondern 2 Fog Of Wars (FOW)

Static FOW ist einfacher (einmal aufgedeckt, bleibt offen):

Der erste FOW wird auf der CPU berechnet und für die Spielelogik verwendet, um zu testen, welche Einheiten im Spiel "sehen" und was nicht. Für ein RTS muss es zu 100% zwischen allen Maschinen und Grafikeinstellungen des Players identisch und zu 100% wiederholbar sein, vorausgesetzt, dass RTS traditionell den Mehrspielermodus mit Sperrschritt verwendet. Um eine zusätzliche CPU-Auslastung zu vermeiden, muss diese detaillierter sein - z. B. 1 Beispiel pro Plättchen pro 5 Ticks der Spielelogik (oder Sie können optimieren, indem Sie die Sicht der Einheiten nur aktualisieren, wenn sie auf einem neuen Plättchen ankommen).

Der zweite FOW wird auf der GPU gerendert und ist dynamischer / detaillierter. Diesen FOW sieht der Spieler . Die GPU kann jedes Bild mit einer viel höheren Auflösung rendern / aktualisieren, die die CPU verarbeiten kann (z. B. 4096 * 4096 Pixel), um glatte Sichtkreise zu erzeugen. Da der FOW viel genauer ist, kann die Spiellogik leicht vom FOW abweichen, was in Ordnung ist, da typische Fehlanpassungen am FOW-Rand auftreten, wo die genaue Beurteilung vage ist.

Warum nicht GPU FOW sowohl für Logik als auch für Grafik verwenden? Das Streamen von Texturdaten von der GPU zurück zur CPU nimmt viel Zeit in Anspruch. Das Rendern von GPUs kann nicht als vertrauenswürdig eingestuft werden. Es kann sich stark zwischen den Konfigurationen / Treibern / Einstellungen der Player unterscheiden.

Für statische FOW können Sie mit einer Art "additiven" Updates davonkommen - jedes Mal für jede FOW-Probe - wählen Sie die hellste aus und behalten Sie sie.


Herstellung FOW dynamisch ist ein weiteres komplexes Problem. Im einfachsten Fall kann dynamisches FOW 5 Zustände annehmen: vollständig abgedeckt, halb erforscht, erforscht, halb aufgedeckt, vollständig aufgedeckt. Sie können diese Zustände auf 0, 1-49, 50, 51-99, 100-255 abbilden. Wenn die Einheit Nebel aufdeckt, zeigt sie ihn auf 255. Jedes Häkchen, das Sie "halb aufgedeckt" und "vollständig aufgedeckt" um 10 verringern, bedeutet, dass beim Verlassen der Einheit der FOW 15 Zecken "vollständig aufgedeckt" bleibt, bevor Sie beginnen verblassen bis halb enthüllt und dann weitere 5 Ticks, bevor Sie bei "erkundet" anhalten.

Kromster
quelle
Wie erhalte ich Informationen zu Positionen und Radien, die maskiert werden sollen oder nicht? Wo sollen die Werte für wie viele Ticks gespeichert werden, die in diesem Bereich noch sichtbar sein sollen? Wenn diese Teile nicht effizient ausgeführt werden, wie in der Frage gestellt, gibt es keinen Grund, sie als effiziente Lösung zu bezeichnen. Wenn Sie erklären können, wie das geht, sind Sie der Beste! Es ist schade, dass OP diese Frage als beantwortet geschlossen hat. Weil er keine wirkliche Vorstellung von einer Lösung eines Nebels der Kriegsumsetzung bekam. Die Antwort gibt gute Praktiken, aber es steckt noch so viel dahinter.
Candid Moon _Max_
Würden Sie zum Beispiel jede Einheit O (n) oder jede Kachel O (n ^ 2) durchgehen? Oder fügen Sie jede Einheit hinzu, die sein Plättchen in Heap geändert hat, und führen Sie dies mit O (2log (n)) aus (Hinzufügen + Entfernen).
Candid Moon _Max_
Sie können auch einen Fibonacci-Heap hinzufügen, der ihn zu O (log (n)) macht.
Candid Moon _Max_
-2

Mit Unity können Sie einer Lichtquelle ein "Cookie" hinzufügen, das das Licht basierend auf einer Bildtextur maskiert. Sie können es aktualisieren, indem Sie eine RenderTexture für diese Textur verwenden und diese dann mit Ihrem Kriegsnebel aktualisieren.

Ich würde vorschlagen, den rohen Nebel der Kriegsdaten im Hauptspeicher zu behalten und zu aktualisieren und dann einmal pro Frame alles, was Sie für Ihre Nebel des Krieges benötigen, in die RenderTexture zu übertragen.

user248636
quelle
Dies beantwortet die Frage nicht.
Sean Middleditch
2
Ich denke, Sie wurden abgelehnt, weil es die Frage in einem bestimmten Kontext beantwortet: Einheit, in einer allgemeinen Frage
MVCDS