|
Culling system |
Top Previous Next |
|
Der folgende Code ermöglicht Ihnen mehrere Dinge: - Planen Sie die Polygonzahl der Entities Ihres Levels; - Schätzen Sie die Systemvoraussetzungen Ihres Spieles ab; - Erwarten Sie einen signifikanten Schub in der Framerate in großen, detaillierten Levels.
Öffnen Sie test1.wmp und starten Sie es mit dem culling.wdl Skript:
Einige Werte erscheinen auf dem Bildschirm: - Culling distance (2000 Quants) teilt der Engine mit, dass alle Entities außerhalb dieser Reichweite entfernt werden sollen; - Visible entities (86) zeigt die Zahl der momentan auf dem Bildschirm sichtbaren Entities; - Visible model poly (412.244) gibt die Zahl der Modelpolygone, die pro Frame gerendert werden müssen; - Visible map poly (258) gibt dasselbe für die Polygone aus Level Geometrie an; - Used memory (3 MB) gibt den genutzten Grafikspeicher an; - Free memory (155 MB) ist der noch freie Grafikspeicher auf der Grafikkarte; - Fog range (20.000 Quants) zeigt die Nebelreichweite, sofern dieser eingeschaltet ist; - Frame rate (15 fps) zeigt natürlich die Frame Rate.
So wie es aussieht ist mein PC mit so vielen (immerhin über 400.000!) Polygonen pro Frame etwas überfordert; falls ich jedoch einige Sekunden warte, werden viele Kugeln automatisch entfernt. Jede Kugel hat übrigens etwa 10.000 Polygone.
Was ist geschehen? Die Engine hat alle Kugeln entfernt, die weiter als 2000 Quants vom Spieler entfernt sind, was die Framerate auf angenehme 45 fps bringt. Drücken und halten Sie die Leertaste und klicken Sie dann auf den “Manual culling” Knopf. Nun können Sie den “Culling range” Slider manipulieren und direkt erkennen, wie seine Einstellung die Zahl der gezeigten Entities verändert und damit auch die Framerate. Halten Sie die Leertaste weiter gedrückt, während Sie den Slider bewegen.
Wie Sie sehen werden bei einer Distanz von ungefähr 3300 Quants etwa 330.000 Polygone dargestellt, die auf meinem PC zu einer Framerate von spielbaren 21 fps führen. In dieser Demo sind die sinnvollen werte immer irgendwo zwischen 1000 und 10.000 Quants, weil ich so viele Polygone wie möglich in einem kleinen Bereich darstellen wollte. Ermitteln Sie Ihre eigene Reichweite in Ihren “richtigen” Levels und verwenden Sie diesen Wert, um Entities zu entfernen, die diese Reichweite übersteigen, indem Sie diese unsichtbar machen (wie ich in meiner Demo) oder indem Sie die ermittelte Distanz als Wert für camera.clip_far verwenden.
Bereit für etwas Neues? Drücken Sie den “Auto culling” Knopf (wieder bei gedrückter Leertaste). Jetzt können Sie die gewünschte Frame Rate einstellen und die Engine wird automatisch Kugeln entfernen / hinzufügen, bis die Framerate nahe am gewünschten Wert ist.
Die Werte ändern sich ein wenig, weil die Kugeln sehr viele Polygone haben, aber Sie können auf diese Weise gut einen Wert für die Polygonzahl ermitteln, der auf Ihrem PC eine gute Framerate garantiert.
Das obige Bild zeigt, dass mein PC etwa 240.000 Polygone zugleich darstellen kann, wenn ich die Framerate auf etwa 30 fps halten will. Ausgehend von diesem Wert kann ich also die Poylgonzahl meiner Models für Bäume, Gebäude etc. so planen, dass ich nie mehr als 240.000 zugleich sichtbar habe. Ich kann natürlich Millionen von Polygonen in meinem Level haben, es sollten nur nicht mehr als 240.000 zugleich sichtbar sein. Wenn Sie einen schnelleren Computer haben, erhöht sich dieser Wert natürlich entsprechend. Und wenn Sie die Demo auf mehreren Rechnern laufen lassen, können Sie auf diese Weite die Systemvoraussetzungen Ihres Spiels gut kalkulieren, je nach sichtbarer Polygonzahl und Framerate.
Beachten Sie bitte, dass der “Auto culling” Modus im eigentlichen Spiel nicht verwendet werden sollte – sein einziger Zweck ist es, Ihnen zu helfen, Ihre Entities und Level Geometrie zu planen, um eine gute Framerate zu erhalten. Testen wir nun das Nebelsystem: Klicken Sie auf “Manual culling” und dann auf “Fog”.
Stellen Sie den “Fog range” slider ein, bis der Nebel die Kugeln bedeckt, die weit vom Spieler entfernt sind. Als Faustregel gilt: “Fog range” sollte einen Wert haben, der nah an der Culling Reichweite liegt.
Wir können das Culling System auch in Echtzeit testen, weil wir unseren Spieler mit den Pfeiltasten bewegen können. Bewegen Sie sich durch das Level und Sie werden vorher verborgene Kugeln sehen, die eingeblendet werden, wenn der Spieler näher kommt. Drücken Sie erneut auf den “Fog” Knopf, um den Nebel abzuschalten.
Der Code erlaubt Ihnen auch zu verhindern, dass eine Entity ausgeschaltet wird; Sie könnten das zum Beispiel für einen Pfeil verwenden, der den Zielort anzeigt – Sie möchten ja nicht, dass dieser nicht mehr sichtbar ist!
Sehen Sie die Wache in der Entfernung? Sie wurde nicht ausgeblendet, weil ich Flag8 angewählt habe. Machen Sie das Gleiche für alle Entities, die nicht verschwinden sollen.
Und so können Sie den Code in Ihren Levels nutzen: - Geben Sie den Entities in Ihrem Level, die keine eigene Action haben die Action mit Namen “my_entity”; - Die Entities mit eigener Action müssen nicht verändert werden; - Klicken Sie Flag8 für alle Entities an, die nicht ausgeblendet werden sollen.
Ich verwende ent_next, um die Entities durchzugehen und mache sie sichtbar oder unsichtbar, eine nach der anderen. Falls Ihr Level tausende von Entities enthält, möchten Sie vielleicht eine schnellere Methode nutzen, wie mehrere parallel laufende starter Funktionen, welche den Abstand zwischen dem Spieler und den Objekten messen und entsprechend ein- und ausblenden.
|