Optimierung einer großen FM

  • Tutorial: Optimierung einer großen FM
    zwecks besserer Performance
    Immer wieder sind (vor allem) unter NewDark erhebliche Probleme mit der Performance zu verzeichnen. Das liegt im wesentlichen daran, dass unter NewDark vieles möglich ist, das ziemlich viele Ressourcen verbraucht.
    Nun ein kleiner Führer, wie man seine FM von Anfang an optimieren kann. Und auch eine kleine Anleitung für Spieler, wie sie möglichst viel herausholen können.


    Für Spieler und Dromeder.
    Bearbeite die cam_ext.cfg mit einem Editor. Folgende Einträge bearbeiten
    -Deaktiviere multisampling "multisampletype 8".
    -Deaktiviere "d3d_disp_enable_hdr"
    -Deaktiviere Bloom "postprocessing"
    -Deaktiviere "d3d_disp_sw_cc"
    -Deaktiviere "d3d_disp_enable_distortionfx"
    -Aktiviere "d3d_disp_no_rgb10_buf"
    -Aktiviere set "use_d3d_display".


    Deaktivieren heißt: setze ein „;“ vor die jeweilige Zeile, aktivieren meint: lösche „;“. Speichern nicht vergessen.


    FM Bau von Anfang an optimiert
    Wenn man an einer großen Map arbeitet, wird man irgendwann zu dem Punkt kommen, an dem man sich Gedanken machen muß, wie wohl die Spieler damit zurechtkommen. FM-Bauer bekommen manchmal nicht mehr so richtig mit, dass die Performance nach und nach nachlässt, weil sie sich daran gewöhnen. Ab und zu muß man das überprüfen. In DromEd gibt es ein Tool (show_stats), das übrigens auch in der Konsole so funktionert. „show_stats“ zeigt unter anderem die Frames per Second (FPS) an. Faustregel: Wenn die FPS jemals an einer Stelle unter 25 fällt, haben die Spieler Grund zum Meckern, weil das Spiel nicht mehr flüssig genug läuft.


    Einige Punkte, die man gleich am Anfang der FM-Bauerei beachten sollte
    -Die Airbrushes sollten nicht zu groß sein 100x100, maximal 200x200 sein. Besser mehrere kleine nebeneinander.Ich komme später darauf zurück.
    -Von Anfang an Texturen im dds-Format mit Mipmaps verwenden. Sowohl für Terrain-Brushes, als auch für Objekttexturen. Die Texturen nicht zu groß wählen. Mehr als 512 ist nicht nötig, es sei denn es sind Terrain-Texturen für große Flächen. Mipmaps werden den Speicherverbrauch minimieren und für bessere Performance sorgen.
    -Von Anfang an überlegen, ob man nicht LODs (Level of Detail) auf Objekten verwenden kann.
    Das wird die Performance extrem verbessern. Man kann LODs in der Objekt-Hierarchie schreiben. Sie bleiben auch auf Objekten, wenn man sie kopiert.
    -Durch einen Zufall bin ich auf einen weiteren Trick gestossen, der mit den Eigenschaften von Blockable Brushes zusammenhängt. Türen haben diese Blockable-Eigenschaft, man sieht es an den schwarzen Flächen, die dafür sorgen sollen, dass AIs im Spiel nicht durch Türen sehen können. Der Spieler kann es auch nicht. Denn das führt dazu, dass die Objekt-Polys dahinter nicht mehr sichbar sind. Natürlich kann man nicht überall Türen machen, wo man sie nicht haben will.
    Aber man kann da tricksen. Und zwar mit Hilfe des tnhscripts „TrigProximity“. Es geht so: erst tnhscripts laden. Man erstellt an einer Stelle in der Map, die man nicht einsehen kann, aber deren Hintergrund man blocken will, eine riesige Tür, z. B. 300x2x60, je nachdem, wie es passtl. Dimensions anpassen. Die Tür wird auf „Translating“ gestellt, Speed etwa 100, so dass sie sofort etwa 200 DU im Boden versinkt und wird mindestens 1-2 DU über dem Terrain platziert (sonst gibt’s unschöne Effekte). Die Tür wird von einem Up/down Switch per ControlDevice angefunkt, den man direkt davor platziert. Script auf dem Schalter: TrigProximity. Design Note: proximity =300. Der Radius kann angepasst werden. Nun Optimize. Diese Maßnahme wird locker mehrere hunderte WR-Cells verbraten, aber es wird sich lohnen.


    Geht man nun weit entfernt in den Game-Mode, wird der Blockable-Brush dieser „Tür“ dafür sorgen, dass die Anzahl der Backface-Checks (sichtbare Objekt-Polys) ganz erheblich sinkt. Die FPS wird dafür umso mehr verbessert werden, bis zu 20 in manchen Maps, was eine halbe Welt bedeutet. Kommt man der Stelle mit der Tür/dem Schalter näher, geht die Tür nach unten. Geht man wieder weg, geht die Tür automatisch nach oben. Nur sollte der Spieler von all dem nichts mitbekommen. Dafür muß man sorgen, indem man Größe, Ort und Radius richtig wählt.


    -Ein weiterer Punkt: Spare an WR Cells. Jede WR-Cell braucht Ressourcen. Man kann das wunderbar, indem man mit den Time-Werten spielt. Deshalb sind kleinere Airbrushes auch viel besser, weil sie sich zum „sparen“ eignen.
    Nehmen wir an, eine Map hat 25000 WR-Cells. Nur mit den Time-Werten kann sicherlich 2000-3000 einsparen.


    Was man auf keinen Fall tun sollte
    -Ganz verboten sind (große) Texturen des Formats png und tga. Insbesondere auf SFX-Effekten und Coronas. Das sind wahre Performance-Killer. Auch schlecht sind Objekte mit eingeschaltetem Tweq-Models. Zum einen kann man keine LODs auf solche Objekte legen, zum anderen brauchen sie von Haus aus viele Ressourcen. Z. B. Fackeln haben sowas. Fackeln kann man auch mit nur einem Objekt machen oder zumindest so verstecken, dass sie nicht weithin sichtbar sind.
    -Viele sichtbare Dodecahedrons auf einem Haufen sollte man vermeiden. Die haben zuweilen den kuriosen Effekt, dass die FPS hoch bleibt, das Spiel dennoch ruckelt.


    Wenn das Kind schon in den Brunnen gefallen ist, kann man immer noch etwas verbessern
    -LODs verwenden (meist viel Arbeit)
    -dds/Mipmaps, möglichst klein (eher wenig Arbeit, wenn man einen Batch-Konverter verwendet)
    -Türen/TrigProximity-Tricks wie oben beschrieben (ganz wenig Arbeit). Nachteil: verbraucht hunderte WR-Cells und verhunzt womöglich das Licht an der Stelle.
    -WR-Cells und Objekt-Polys sparen (viel Arbeit)

    -Optimieren mit der Schattenqualität, die man will. Wichtig: Mit Objektschatten optimieren

    -Am Ende die Pathfinding berechnen (run pathfind.cmd).

    Addendum
    -dds mit mipmaps kann man mit einer Vielzahl von Programmen erzeugen, z. B. Paint.net, Photoshop oderGimp mit dds-Plugin, usw. Es gibt sogar Batch-Konverter von Nvidia und AMD und einige andere. Damit geht’s sehr schnell.
    -LODs in DromEd: Add—Shape--Model LOD

  • Danke für die Mühe das hier alles aufzuschreiben, einige Wege kannte ich noch garnicht z.b das mit der Tür, es ist immer wieder gut etwas neues dazuzulernen. Das sollte man sich aufjedenfall immer vor Auge halten sonst passiert so ein Mist wie bei mir mit Herz der Edelsteine. :rolleyes:
    Großen Dank Fibanocci für das Tutorial. :)

  • In meiner großen Map stehe ich vor einem Rätsel.
    Im DromEd game mode habe ich immer ausreichend FPS, durch die Thief2.exe getestet, sind es bis zu 15 FPS weniger. An denselben Stellen im selben Winkel. Die Bedingungen sind gleich.
    Die Ressourcen sind diesselben, die Einstellungen (cam_ext.cfg) auch. Die Auflösung ebenso. Verringere ich die Auflösung, bleibt auch alles gleich. Verringere ich die Sichtweite ebenso.
    Ich habe keine Ahnung, woran es liegen könnte. Die Map ist nach Kräften optimiert (LODs, Mipmaps, usw.).

  • Beide haben LAA gepatcht (ich habs auch ohne probiert). Dasselbe Ergebnis. Die FM braucht eigentlich kein LAA, weniger als 600 MB RAM-Verbrauch. Der fluktuiert allerdings zuweilen stark. Das muß ich nochmal testen.

  • Vielen Dank für die Arbeit, diese Liste zusammenzustellen, fibanocci. :)
    Newdark ist definitiv mächtig, löst aber leider nicht alle Probleme.



    -Ein weiterer Punkt: Spare an WR Cells. Jede WR-Cell braucht Ressourcen. Man kann das wunderbar, indem man mit den Time-Werten spielt. Deshalb sind kleinere Airbrushes auch viel besser, weil sie sich zum „sparen“ eignen.
    Nehmen wir an, eine Map hat 25000 WR-Cells. Nur mit den Time-Werten kann sicherlich 2000-3000 einsparen.

    Was mir beim Arbeiten mit Dromed 1 in Newdark aufgefallen ist, dass diese WR-Cells so mit Abstand der größte Feind werden, wenn man eine größere FM plant. Ich habe mir beispielsweise mal die neuste FM von Intruder angesehen, "Rückkehr zur Verlorenen Stadt". Die ist am absoluten Limit, was diese WR-Cells angeht. Ist zwar recht groß, hat aber auch viele Dodekaeder und sonstige Brushes ineinander gebaut, um die Höhlen weniger eckig rüberkommen zu lassen. Wäre es eine Stadt Mission in der selben Größe gewesen, hätte man sicherlich schon einige WR-Cells gespart, denke ich mir.


    Ich habe auch schon in meinen FMs angefangen, die Air-Brushes in kleinere Bereiche aufzuteilen und mit dem Time Werten ein bisschen rumzuspielen (Air-Brushes haben einen niedrigen Wert als die soliden Brushes darin zum Beispiel) aber ich weiß nicht, ob ich es richtig angehe.
    Wenn du noch ein paar Tipps hast, wie sich WR-Cells einsparen lassen, wäre das sehr Hilfreich und könnte die Liste erweitern. Soweit ich weiß, hast du auch für Christines Stadt-Mission ordentliche Optimierungsarbeit bezüglich der WR-Cells geleistet. ^^

    Denn so viele bauen heute ohne Achtung vor dem großen Erbauer.


    Die Stadt trägt sein Zeichen nicht mehr


    und ewig sucht der Makel des Schwindlers sich Zutritt zu verschaffen.

    • Offizieller Beitrag

    Also ich kämpfe momentan wieder mit der 3. Rabenbachmission.... :rolleyes:


    Was ich bisher gemacht habe ist, den mittleren Bereich aufgeräumt und alles gelöscht, was für den Spieler nicht sichtbar ist. Das hat die wr-cells von 31.667 auf 30.301 reduziert.

    Ich habe einige der Objekte nochmal neu gebaut und vereinfacht und damit die Polys der betreffenden Objekte deutlich reduziert (z.b. die Wäscheleinen). Das schicke buschige Grasobjekt von Dale mußte auch meiner Low-Poly-Version weichen...

    Ich habe einige Objekte (auch Bäume) gelöscht....


    Resultat: nada, nix..... in der einen bestimmten Ecke gehen die fps nach wie vor rapide runter. Ich überlege, ob ich nicht einen großen Solid-brush an betreffende Stelle setze, mit einem Zettel dran auf dem steht, daß ich weiß, daß hier die fps Rate runtergeht 8o. Denn das scheint den Spielern das einzig erwähnenswerte an der Mission zu sein. :S


    Ich will jetzt aber auch nicht anfangen, überall Mauern zu ziehen oder die Hälfte der Objekte zu löschen... Denn dann würde es einfach nicht mehr nach Stadt/Landschaft aussehen, dann wäre es einfach nur leer...


    Hat hier vielleicht noch jemand eine Idee?


    Die 4. Mission hat dafür wieder Teilbereiche mit Tunnelverbindung.... also meine vor-NewDark-Bauweise... nochmal mach ich den Fehler nicht, offen zu bauen.

  • Also, mit der 3. Rabenbach mission hatte ich mich schon ein paarmal beschäftigt. Warum die FPS im unteren linken Eck (wenn man nach Norden schaut) so niedrig ist, hat mir noch nie eingeleuchtet, weil gar nicht so viel im Bild ist.

    show_stats zeigt dort über 47000 Backface checks an. Das ist zwar viel und erklärt die schlechte Performance, ist aber vergleichsweise wenig zu anderen FMs. Meine im Bau befindliche mit Sichtweiten von 2000 DU hat an einigen Stellen mehr als 70000 Backface Checks, die FPS sinkt aber nie unter 30.

    Dort verwende ich aber überall LODs, das ist der Unterschied.


    Ich kann heute Abend mal danach schauen, dann schicke ich dir die überarbeitete mis zu. LODs sind ischnell eingebaut, auch werde ich ein oder zwei "Türen" einauen, wenn es nicht stört. 10 FPS mehr sollte machbar sein. Wenn du willst, kannst du mir auch deine überarbeitete mis zuschicken. Besser wäre eine cow, weil ich die LODs in die Archetypen schreiben will.

    • Offizieller Beitrag

    Warte mal, ich habe schon etliche Änderungen gemacht, ich will noch probieren, ob ich diese Ecke nicht doch "zubauen" kann, ich probiere noch ein bischen und schicke dir dann die überarbeitete cow. (und die neuen Objekte, sonst kriegst du Fehler).

    Mit LODs hatte ich auch mal rumprobiert, aber das fand ich ziemlich scheußlich, da ich sehr weite Sichtweiten habe und man dann sieht, wie aus dem Nichts die Objekte auftauchen (das hasse ich bei diversen Spielen wie die Pest).

    Ich weiß nicht, wie man das gut lösen kann.


    Kann es am Wasser liegen? Oder an den Fischen? (da habe ich ein paar gelöscht)


    Ich müßte genau an der Stelle die Sicht blockieren - dann läuft es prima :S

  • Wasser ist eher nicht das Problem, Fische schon gar nicht. Klar kannst du Wasser mit weniger Frames verwenden, das drückt aber nur den Speicherverbrauch.

    Es sind immer die weithin sichtbaren, aber dennoch quasi versteckten Strukturen, deshalb mache ich auch meine versteckte Türennummer ;)

    LODs muß man geschickt handhaben, dann fallen sie nicht so auf. Z. B. eher kleine, aber polygonreiche/rechenintensive Objekte kann man in jedem Fall so behandeln, z. B. die SFX auf deinen Lampen, die schlucken sicher einige FPS.

    Oder kleine Pflanzen, die die Spielerkamera in jedem Fall einfängt, auch in der Ferne, die du aber kaum sehen kannst. Oder Fackeln, Schilder, usw.. Denk an die kleinen Dinge zuerst.

    • Offizieller Beitrag

    An die Laternen hatte ich auch schon gedacht, ich kann in dem Bereich mal testweise die Links/SFX löschen.


    von den kleinen Pflanzen (z.b. meinen Blumen, die haben viele Polys) habe ich schon etliche gelöscht.


    Wie ist das bei der versteckten Türennummer mit den AI's? Würden die die Tür öffnen können? Und wenn sie das dann tun, wenn ich an besagter Stelle stehe? Oder müßte ich dann die Wachen umleiten?

  • Die Türen kannst du so einstellen, dass sie auf die Pathfinding Database keinen Einfluß haben

    -AI--Utility--Path Avoid: None

    -Physics--Misc--AiICollides with--false


    Zwischen Up/Down switch mit dem Proximity script und der Tür kommt eine RelayTrap. FrobInfo der Tür wird gelöscht. Dann kann eine AI nichts machen.

  • Da ich gerade eine große FM optimiere, noch einen Tipp.


    -Optimieren mit der Schattenqualität, die man will. Wichtig: Mit Objektschatten optimieren. Das wird bis zu 2 FPS bringen


    -Am Ende die Pathfinding berechnen (run pathfind.cmd). Das wird nochmal bis zu 3-4 FPS bringen.

    "Complete Processing" macht das in der richtigen Reihenfolge, allerdings muß man erst mal im Build Dialog die gewünschten Einstellungen treffen.

  • Um einige FPS herauszuquetschen, habe ich heute was ausprobiert.

    In einer großen Map (2000x2000 DU) habe ich an einer Stelle einen etwa 200x1x400 DU großen Solid mit SkyHack mittenrein in den "Air"-Bereich gemacht. Skyhack hat in dem Fall eine 8x8 große Cubemap-Textur. Eigentlich sollte man das mit dem Skyhack-Solid nicht machen, weil seltsame Effekte drohen.

    Aber nur, wenn man das Ding aus der Nähe sieht. Das ist bei mir nicht möglich.


    Seht selbst (Aufnahmen im Fly-Modus): 1. Bild: Im Abstand von etwa 10 DU zum Solid: Man sieht noch alles - genauer gesagt: man sieht einfach durch.

    2. Bild (sehr nahe am Solid): Der Hintergrund wird ausgeblendet, wie erwartet.


    Das sieht man im Spiel natürlich nicht. Aber es hat einen tollen Effekt: Ich spare mit dieser einfachen Maßnahme 3-4 FPS :)

  • Ich dachte eigentlich auch, dass die Map schon zu Tode optimiert wäre. Ich bin überrascht. Allerdings mußte ich den Nebel etwas dichter machen, weil man aus einem bestimmten Winkel (ganz am Rand) eine Störung sieht.

    • Offizieller Beitrag

    Ich könnte noch ein paar Tipps zur WR-Cell Reduzierung brauchen :/


    Also die 5. Lord Ashton Mission hat jetzt 27.384 WR-Cells. (über 1000 habe ich schon bei der Reduzierung rausgeholt) Wäre soweit ok, aber ich bin mit dem Überarbeiten des alten Levels noch nicht fertig. Ich vermute mal, daß ich am Ende so an die 30.000 Cells haben werde. Und eigentlich wollte ich das Gefängnis noch ausbauen (finde ich doch recht klein) - und ich wollte auch den Außenbereich erweitern. Aber das klappt wohl nicht mehr. Dabei ist das Level eigentlich gar nicht so groß - hat aber jede Menge Cylinder und ein paar Wendeltreppen... ?(


    Bei Rabenbach hat es ziemlich viel gebracht, Cylinder und solid-brushes (besonders Treppen) In Time auf End zu setzen. Leider bringt mir das hier so gut wie nix, weil ich die Cylinder ja alle neu gemacht habe, ebenso die Treppen.