[TUT] Performance Tutorial (Update 15.09)

  • Hallo Leute,


    da ich immer wieder von Leuten höre, dass sie Probleme mit "Bad Allocation" oder irgendwelche sonstigen Performance-Probleme haben habe ich mir überlegt, ein Performance-Tutorial zu machen. Damit kann ich mein gesammeltes Wissen endlich mal frei rauslassen. :D


    Damit man mit dem Tutorial etwas anfangen kann braucht man einige Programme (s.u.). Ich werde nicht auf die Bedienung der einzelnen Programme eingehen, sofern sie nichts mit dem Thema zu tun haben. Das würde den Rahmen des Tutorials sprengen. Da sollte man also schon zumindest die Basics kennen. Die Programme sind übrigens, mit Ausnahme von Photoshop, alle kostenlos. Da es aber einige Leute gibt, die Photoshop haben/benutzen, habe ich es hier trotzdem mit aufgelistet. Paint-NET, GIMP und Photoshop sind alternativen zueinander, d.h. man braucht also nur eins der Programme, die anderen sind optional. GIMP kann ich aber trotzdem nur empfehlen, da ich aus eigenen Erfahrungen weiß, das in einigen Fällen eine Textur nicht von Paint.NET geöffnet werden kann. Photoshop habe ich selbst nicht, kann da also auch nichts zu sagen. An dieser Stelle noch ein Dankeschön an blackburner für die Screenshots vom Photoshop-Plugin.
    GE (Giants Editor) -> Version 4.1.7 ist im Ordner "sdk" im Installationsverzeichnis des LS (normalerweise C:/Programme/Landwirtschafts Simulator 2011) zu finden. Version 4.1.9 gibts hier zum Download (nach einer kostenlosen Registrierung): Download Page
    WTV (Windows Texture Viewer) -> Download Page
    Paint.NET -> Download Page
    GIMP -> Download Page
    DDS-Plugin für GIMP (ohne das Plugin kann GIMP nicht mit DDS Dateien umgehen) -> Download Page
    Photoshop-Plugin -> Download Page
    Notepad++ -> Download Page


    Der Aufbau des Tutorials:
    -Was ist DDS und warum sollte man DDS für Texturen verwenden?
    -Welche Einstellungen brauche ich für meine DDS Texturen?
    -GE: so spart man sich viel Arbeit beim konvertieren
    -WTV: so kontrolliert man DDS Dateien
    -Paint.NET, GIMP, Photoshop: Die Einstellungen des DDS Formates
    -Was sind Polys?
    -Was sind ClipDistances und warum sollte man diese anpassen?
    -ClipDistances: So passt man diese sinnvoll an
    -Tipps & Tricks: Mit Notepad++ schnell viele ClipDistances anpassen
    -Sonstiges: was noch eine Rolle bei der Performance spielt


    Ich werde das Tutorial in mehreren Schritten erstellen, da auch ich ein Reallife habe und euch doch das Wissen möglichst schnell vermitteln möchte. Außerdem kann ich so auf euer Feedback eingehen und eventuell in späteren Schritten etwas besser/anders machen. Des Weiteren verlinke ich (unter dem Tutorial) als Zusatz auf Posts von Stegei (Stefan Geiger, der Lead Programmer von Giants). Seine super Beiträge haben dieses Tutorial überhaupt erst ermöglicht. Ohne diese wüsste ich jetzt vermutlich noch immer nicht über dieses Thema Bescheid (nochmal ein ganz herzliches Dankeschön dafür).
    Wenn das Tutorial komplett ist und ich euer Feedback mit eingebaut/berücksichtigt habe wird es auch eine PDF-Version geben. Diese könnt/düft/solltet ihr dann auf möglichst vielen Seiten verbreiten, damit auch möglichst viele Leute einen Vorteil davon haben. Bis dahin könnt ihr dann ja schonmal fleißig auf diesen Thread verlinken.



    -Was ist DDS und warum sollte man DDS für Texturen verwenden?
    DDS ist die Abkürzung von Direct Draw Surface und wurde von Microsoft speziell zur Optimierung von Texturen entwickelt.
    Der Hauptvorteil von DDS ist der geringere Speicherverbrauch auf der Grafikkarte (nachfolgend VRAM genannt). Im Vergleich zu PNG und JPG braucht eine DDS Textur bei gleicher Auflösung nur 1/8 VRAM. Da Speicher ja bekanntlich endlich und begrenzt ist, sollte es einem nicht schwer fallen sich vor zu stellen, wie gut diese Einsparung ist. Vor allem, weil die Qualität der Texturen gleich bleibt.
    Weiterer Vorteil ist das deutlich schnellere Laden der DDS-Texturen. PNG und JPG-Texturen sind stark komprimierte Formate. Diese müssen erst dekomprimiert werden, bevor die Grafikkarte etwas damit anfangen kann. DDS-Texturen brauchen nicht dekomprimiert werden, dadurch werden diese ca 8-10 mal schneller geladen. Vor allem bei Maps macht sich das in LS deutlich bemerkbar.
    Durch den deutlich geringeren Speicherverbrauch wird außerdem der bekannte Bad Allocation Absturz weitestgehend verhindert. Den gibt es, wie bekannt sein dürfte, wenn der vom Spiel benutzbare Speicher (2GB normalerweise, nach Anwendung des CFF-Explorers 3GB bei 32bit Betriebssystemen bzw. 4GB bei 64bit Betriebssystemen) voll ist. Bei einem geringeren Speicherverbrauch der Texturen dauert es logischerweise deutlich länger, bevor der Speicher voll ist und das Spiel abstürzt.
    (Quelle: Link 1)



    -Welche Einstellungen brauch ich für meine DDS Texturen?
    Kommen wir nun zu den Einstellungen, die man verwenden sollte. DDS ist nämlich nicht gleich DDS, da gibt es riesige Unterschiede.
    Programme wie Paint.NET und GIMP bieten sehr viele verschiedene Einstellungen. Da die meisten für LS irrelevant sind hier mal die relevanten Einstellungen (Beispieltexturen folgen im Abschnitt WTV):
    DXT1: Diese Komprimierung verwendet man, wenn die Textur keine Transparenten Pixel hat. Da JPG keine Transparenz kennt kann man zum konvertieren solcher Texturen immer DXT1 verwenden. Diese Komprimierung verwendet am wenigsten Speicher. Deswegen sollte man diese verwenden, wo es nur möglich ist.
    DXT3: Diese Komprimierung verwendet man bei binärer Transparenz. Das heißt, wenn die Pixel einer Textur entweder voll transparent sind, oder nicht transparent. Zum speichern des Alpha-Kanals (Alpha bezeichnet die Transparenz in einem Bild) wird extra Speicher gebraucht. Deswegen belegt eine mit DXT3 gespeicherte Textur doppelt soviel Speicher wie eine DXT1 Textur.
    DXT5: Diese wird bei Texturen mit mehrstufiger Transparenz verwendet. Dies ist oftmals bei Fenster- und Partikel-Texturen der Fall. DXT5 braucht genauso viel Speicher wie DXT3.
    Die Auflösung: Die Auflösung der Texturen ist sehr wichtig. Erlaubt sind hier nur Kantenlängen von 2^n (ausgesprochen 2 hoch n). Das sind alle Werte von 2^2 bis 2^11. In Zahlen ausgedrückt sind das folgende: 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048. Dabei braucht eine Textur nicht unbedingt quadratisch sein, sondern kann auch rechteckig sein. Es ist also nicht nur z.B. 256*256 erlaubt, sondern auch 256*64, oder 256*1024, oder 2048*512, nur um einige Beispiele zu nennen. Hintergrund ist die Teilbarkeit durch 2. Außerdem haben einige AMD/ATI Grafikkarten Probleme mit Texturen, die nicht diese Auflösungen entsprechen.
    Des Weiteren sollte man auch darauf achten, dass Texturen nicht unnötig groß sind. Einfarbige Texturen brauchen nur 4*4 groß zu sein. Mag zwar selbstverständlich klingen, ist es scheinbar nicht. Ich habe nämlich schon öfters einfarbige PNG-Texturen mit einer Auflösung von 2048*2048 gesehen. Das sind dann 16MB überflüssiger VRAM-Verbrauch. Generell gilt: je mehr Details eine Textur hat, umso größer darf sie sein. Wenn die ganze Textur von einem Fahrzeug in einer Datei ist kann diese in den meisten Fällen ruhig 2048px Kantenlänge haben. Für Räder z.B. reichen 512 oder 1024. Man muss halt ein bisschen nach Gefühl gehen, welche Auflösung da notwendig ist.
    MipMaps: Diese kann man beim Speichern automatisch generieren lassen. Das sollte man bei allen Texturen machen, außer bei HUD-Texturen. HUD-Texturen sind jene, die nur auf dem Bildschirm dargestellt werden und nicht auf 3D Objekte projiziert werden. Dies ist z.B. bei Bildern für den Shop, die Mapvorschau und die PDA Map der Fall.
    Ein kleiner Nachteil der MipMaps ist der um 1/3 größere Speicherverbrauch (im Vergleich zu ohne MipMaps). Dieser Nachteil ist allerdings so gering, dass man sie vernachlässigen kann, zumal eine Textur mit DXT1 und MipMaps nur 1/6 an VRAM belegt im Vergleich zu PNG/JPG und mit DXT3/DXT5 mit MipMaps immerhin noch nur 1/3.
    Der Vorteil der MipMaps liegt darin, dass sie für eine bessere Qualität und eine deutlich höhere Performance sorgen. Das liegt an den verschiedenen Auflösungen der Textur, die in der Datei gespeichert sind. Hier ist die Teilbarkeit durch 2 wichtig, aus 4 Pixeln (2*2) wird 1 Pixel für die nächst kleinere MipMap. Die Grafikkarte sucht sich die MipMap raus, bei der möglichst ein Pixel der Textur auf ein Pixel des Objekts projiziert werden kann. Wenn ein Objekt auf dem Bildschirm also eine Größe von z.B. 256*256 Pixeln hat, die Textur eine Auflösung von 1024*1024 hat und mit MipMaps gespeichert wurde braucht nur die MipMap mit 256*256 Auflösung für die Darstellung verwendet zu werden. Dadurch wird deutlich weniger Bandbreite benötigt (weil die kleine MipMap ja wesentlich weniger Speicher belegt als die große MipMap), woraus sich wiederum die verbesserte Performance ergibt.
    Weiterer Vorteil der MipMaps für LS steckt in den Hardware Profilen. Auf low und medium wird die größte MipMap weggelassen. Wenn man also eine Textur mit 1024*1024 Pixeln Auflösung hat werden nur die einzelnen MipMaps mit 512*512 und kleinere Auflösung verwendet. Hierdurch spart man sich 75% VRAM. Das ist vor allem bei ältere Grafikkarten mit wenig VRAM von Vorteil. Das geht natürlich auf Kosten der Details, aber dafür gibt es eine gute Performance und die ist meiner Meinung nach wichtiger als die kleinen Details, denn was bringt einem die tollste Grafik, wenn das Spiel nicht vernünftig läuft?
    (Quellen: Links 2 und 3)


    An dieser Stelle möchte ich noch kurz darauf hinweisen, dass für LS13 alle Texturen als DDS mit korrekter Auflösung vorliegen sollten. Ansonsten ist die LOG nicht fehlerfrei, weil es dann entsprechende Performance-Warnungen gibt.
    (Quelle: Link 3)



    -GE: so spart man sich viel Arbeit beim konvertieren
    Jetzt wisst ihr, was DDS ist, warum man die Texturen als DDS abspeichern sollte und welche Einstellungen man dabei benutzen sollte. Bevor man nun die ganzen Texturen konvertiert sollte man erstmal die Map aufräumen. Das heißt, dass wir alle überflüssigen Dateien löschen. Bei einer Durchschnittsmap sind das doch schon sehr viele und es will sich ja keiner beim konvertieren unnötige Arbeit machen. Das Ganze kann man übrigens auch bei normale Mods machen, ist aber in den meisten Fällen nicht notwendig und außerdem aufwendiger als bei Maps.
    Keine Angst, man braucht sich da nicht durch alle Dateien durchquälen und überprüfen, ob diese überflüssig sind. Der GE hat nämlich eine Funktion, womit das aufräumen ganz einfach geht. Die Funktion ist zu finden im Menü "File" und heißt "Export All with Files". Bevor man diese Funktion benutzt muss man allerdings noch zwei Kleinigkeiten erledigen:


    1. Die Pfade in der i3d müssen überprüft werden. Klingt schwieriger als es ist. Hintergrund: Die Exportier-Funktion des GE kann nicht mit backslashes (\) umgehen, die sich oftmals bei Sketchup-Objekte einschleichen. Deswegen öffnet man die i3d mit Notepad++, klickt oben im Menü auf "Suchen" und dort auf "Ersetzen". Alternativ kann man die Tastenkombination STRG + H verwenden. Bei "Suchen nach" gibt man jetzt den Backslash ein (der ist auf der Tastatur beim ß) und bei "Ersetzen durch" den normalen Slash (/, bei der 7). Dann klickt man auf "Alle ersetzen" und schon ist man fertig. Kommt da die Meldung, dass nichts ersetzt wurde war der Schritt überflüssig. Kommt die Meldung das eine oder mehrere ersetzt wurden kann man sich jetzt darüber freuen, dass man sich einen haufen Ärger erspart hat. Es lohnt sich also auf jeden Fall dies zu kontrollieren, zumal das eine Sache von wenigen Sekunden ist. Vergisst man das kann daraus schnell Minuten, oder bei unerfahrenen Leuten auch schnell mal Stunden werden.


    2. Es muss ein neuer Ordner angelegt werden. Man braucht nämlich einen leeren Ordner, wo die Map hin exportiert werden soll. Wo dieser Ordner sich befindet ist relativ egal. Es empfiehlt sich aber diesen an der gleichen Stelle anzulegen, wo der Ursprungsordner der Map ist. Name ist auch relativ egal, es empfiehlt sich aber hier einen sinnvollen Namen zu verwenden. Ich verwende immer den originalen Namen und hänge ein Unterstrich (_) an. Dadurch lassen sich die Ordner leicht unterscheiden und auch im Nachhinein weiß man noch, um welche Map es sich handelt.
    Nun kann man die "Export All with Files"-Funktion anwenden. Dazu öffnet man die Map mit dem GE und klickt die Funktion an. Da muss man den Ort angeben, wohin die Map exportiert werden soll. Dort gibt man jetzt den grade angelegten, leeren Ordner an. Als Name wird der gleiche wie die der i3d der Map an, in den allermeisten Fällen wird das "map01" sein. Nur in einigen wenigen Fällen wurde die Datei umbenannt, dann muss man den entsprechenden Namen angeben. Je nach Größe der Map dauert dies nun etwas. Sobald die Map exportiert wurde springt der Status links unten auf "Ready". Falls man das Scripting Window noch nicht auf hat sollte man sich dieses jetzt anzeigen lassen. hier werden des öfteren Fehlermeldungen angegeben, die in den allermeisten Fällen aber nichts zu bedeuten haben. Da steht dann, dass bestimmte Dateien nicht kopiert werden konnten. Da sollte man für jede angegebene Datei kurz nachgucken, ob diese im Zielverzeichnis vorhanden ist. Normalerweise ist diese schon vorhanden, sollte diese aber tatsächlich fehlen, muss man diese manuell rüberkopieren. Falls die Datei auch bei der Ursprungsvariante fehlen sollte, hat man ein kleines (oder großes) Problem. In dem Fall kann man nur den Modder anschreiben und ihn bitten, eine gefixte Version zu veröffentlichen. Oder halt auf die Map verzichten. Wenn schon Dateien fehlen hat eine Map meistens eh noch weiter Fehler.
    Jetzt ist die map01.i3d und alle zu der Map gehörenden Texturen in dem neu angelegten Ordner. Damit die Map benutzt werden kann müssen noch die letzten Dateien manuell rüberkopiert werden. Das sind folgende Dateien:
    modDesc.xml
    sampleModMap.lua (kann einen anderen Namen haben, z.B. den Namen der Map)
    defaultVehicles.xml (kann einen anderen Namen haben, z.B. Vehicles.xml oder Fahrzeuge.xml)
    sampleModMap_briefing1.dds
    sampleModMap_briefing2.dds
    sampleModMap_briefing3.dds (können alle drei andere Namen haben, z.B. _briefingX.dds, auch können diese als PNG/JPG vorliegen, sollten dann aber konvertiert werden. Das sind übrigens die 3 Vorschaubilder der Map, die man beim laden sieht.)
    map01/pda_map.dds
    map01/map_preview.dds
    map01/paths (den ganzen Ordner, oder die einzelnen Dateien, aber nur falls der Verkehr/die Fußgänger verändert wurden)
    missions/CattleMeadow.i3d (nur falls nicht die originale Kuhweide verwendet wird. Diese auch nur mit der "Export All with Files"-Funktion rüber kopieren, wegen zugehörige Texturen.)
    Jetzt sollte man die Map kurz testen, dazu diese in den mods-Ordner kopieren. Für den kurzen Test ist es egal, ob die Map als ZIP oder als Ordner im mods-Ordner liegt. In einigen Fällen fehlen doch noch irgendwelche Dateien. Lädt die Map und gibts keine Fehler ist man mit aufräumen fertig. Wird die Map nicht fertig mit laden fehlen noch irgendwelche Dateien. Dazu sollte man die LOG irgendwo speichern und nochmal die funktionierende version der Map laden. Durch einen Vergleich der beiden LOG-Dateien kann man nämlich die fehlenden Dateien ermitteln. Wenn i3d Dateien geladen werden wird nämlich eine kleine Meldung mit Pfad und Dateiname in der LOG geschrieben. Meistens handelt es sich bei den fehlenden Dateien um ParticleSystems.



    -WTV: so kontrolliert man DDS Dateien
    Jetzt hat man eine saubere Map ohne überflüssige Dateien. Bevor ich nun zum eigentlichen konvertieren komme möchte ich erst den WTV erklären. Da DDS nicht gleich DDS ist, wie ich schon erwähnt habe, braucht man ein Tool, um die bereits vorhandenen DDS-Dateien zu kontrollieren. Hier gibts nur ein Tool, den WTV. Das Tool ist super schnell und muss nicht installiert werden. Ich lasse DDS-Dateien standard mit dem WTV öffnen, ich kanns auch nur weiter empfehlen. Und so sieht der WTV aus:

    Bei der ersten Markierung wird das Format/die Komprimierung gezeigt. Steht hier was anderes als DXT1, DXT3 oder DXT5 muss die Textur neu gespeichert werden.
    Bei der zweiten Markierung wird die Auflösung angezeigt. Ist da eine andere Auflösung als die erlaubten angegeben muss die Textur skaliert werden.
    Bei der dritten Markierung sind die Anzahl MipMaps angegeben. Steht hier 1/1 und handelt es sich nicht um eine HUD-Textur muss diese neu gespeichert werden.
    DXT1 Beispiele:


    DXT3 Beispiele:

    Hier nun einige Beispiele für DXT3-Texturen. Wie man sieht ist da ein grelles Rosa zu sehen. Das ist die standardmäßig eingestellte Hintergrundfarbe. Man kann diese Farbe zwar ändern, ist aber nicht empfehlenswert. Da Rosa für Texturen normalerweise nicht verwendet wird lässt sich so die Transparenz leicht erkennen, da diese rosa dargestellt wird. Das dritte Bild ist übrigens gleichzeitig ein Beispiel für eine HUD-Texture. Wie man sieht steht bei MipMap 1/1, was soviel heißt wie es wurden keine MipMaps erstellt/generiert.
    Anmerkung dazu: Falls eine Textur in falscher Auflösung vorliegt wird in einigen Fällen einen transparenten Streifen angezeigt, der in wirklichkeit nicht vorhanden ist. Da sollte man also beim bearbeiten kontrollieren, ob da tatsächlich transparente Pixel sind, oder es nur an der Auflösung liegt. Nicht das man als DXT3 abspeichert, obwohl man DXT1 verwenden sollte. Siehe dazu dieses Beispiel:

    Dann gibts noch Texturen, die zwar transparente Pixel haben, aber dennoch als DXT1 abgespeichert werden können. Da hat dann der Modder unsauber gearbeitet und einen transparenten Hintergrund als Vorlage verwendet, anstatt einen schwarzen, bzw hat am Ende vergessen den Hintergrund vollständig schwarz zu machen. Hier so ein Beispiel:


    DXT5 Beispiele:

    Hier einige Beispiele für DXT5-Texturen. Wie man sieht schimmert es an einigen Stellen Rosa durch, zugleich sieht man aber noch eine andere Farbe. Das sind nicht vollständig transparente Pixel, sowas wird als mehrstufiger Transparenz bezeichnet. In einigen Fällen ist eine solche mehrstufige Transparenz schlecht zu erkennen. Diese lassen sich oftmals mit Paint.NET bzw GIMP leichter erkennen. Falls man sich nicht sicher ist sollte man (meiner Meinung nach) DXT5 anstatt DXT3 verwenden. Ob man im Spiel einen Unterschied sieht habe ich ehrlich gesagt noch nicht ausprobiert. Da DXT5 aber genauso viel VRAM verbraucht wie DXT3 bevorzuge ich in so einem Fall DXT5.



    An dieser Stelle noch ein wichtiger Hinweis: Die PNG-Dateien im Ordner "map01" müssen als PNG vorliegen (außer pda_map.dds und map_preview.dds). Ansonsten gibt es Fehlermeldungen und funktioniert die Map nicht mehr. Für den Ordner "textures" (hier sind sämtliche Texturen für das Terrain und die Pflanzen drin) gilt ähnliches. Alle Texturen mit "distance" im Namen müssen als PNG vorliegen, alle anderen sollten als DDS vorliegen.



    -Paint.NET, GIMP, Photoshop: Die Einstellungen des DDS Formates
    Da jetzt alle Vorbereitungen getroffen sind , kann man mit dem konvertieren anfangen. Zuerst die Erklärung zu Paint.NET, weil dieses Programm am einfachsten zu bedienen ist, von Haus aus mit DDS-Dateien umgehen kann und wohl von den allermeisten Leuten verwendet wird.

    Hier gibt es im Prinzip nur 2 wichtige Stellen: einmal den "Kompressortyp", wo DXT1, DXT3, oder DXT5 angegeben wird und einmal das Häkchen für die MipMaps.
    Hier jetzt die Einstellungen für GIMP.

    Auch hier wieder 2 wichtige Stellen: einmal die "Compression", wo das entsprechende DXT Format ausgewählt wird und die Einstellung für die MipMaps. Hier hat man die Möglichkeit entweder keine MipMaps zu speichern, MipMaps erstellen zu lassen, oder vorhandene MipMaps zu verwenden. Vorhandene MipMaps verwenden macht nur dann Sinn, wenn man keine Auflösung verändert hat.
    Zu guter Letzt die Einstellungen für Photoshop:

    Auch hier ist es wieder das Gleiche. DXT Format wählen und MipMaps entsprechend erstellen, falls es sich nicht um eine HUD-Textur handelt.
    Bei allen drei Programmen kann man die sonstigen Einstellungen so lassen, wie sie sind. Man kann da vielleicht noch ein kleines Bisschen Qualität rausholen, bei meinen Experimenten konnte ich aber keinen sichtbaren Unterschied feststellen.



    -Was sind Polys?
    Poly ist die Abkürzung von Polygon und bedeutet Vieleck. Wenn Polys in Bezug auf Videospiele genannt wird sind damit Dreiecke gemeint. Für jedes Dreieck werden 3 Punkte in einem 3-Dimensionalen Raum gesetzt, diese werden miteinander verbunden und bilden dann eine Fläche. Für ein ganzes Objekt werden viele solcher Flächen, oder allgemein Polys genannt, zusammengesetzt.
    Kleine Anmerkung: Modell, Objekt und Shape sind Synonyme. Als Modell wird meistens ein Fahrzeug, ein Gerät etc bezeichnet, Objekt für Gebäude etc auf einer Map, Shape ist die Bezeichnung in den i3d-Dateien. Im Prinzip kommts aber aufs Gleiche raus, deswegen verwende ich nachfolgend die Bezeichnung "Objekt" um nicht unnötig zu verwirren und weil die nächsten Abschnitte hauptsächlich Maps betreffen.
    Je mehr Polys man für ein Objekt verwendet, umso mehr Details kann man verbauen. Mehr Polys heißt aber nicht automatisch mehr Details. Simples Beispiel: Ein Würfel besteht aus 6 viereckige Seiten, pro Seite braucht man 2 Dreiecke, macht also insgesamt minimal 12 Polys. Jetzt kann man aber die Seiten in mehrere Flächen aufteilen, z.B. in drei Teile in der Höhe und Breite, ergibt 9 Flächen pro Seite. 9 Flächen mal 2 Polys mal 6 Seiten sind insgesamt 108 Polys bei gleichem Detailgrad wie mir 12 Polys. Sind also ganze 96 überflüssige Polys, 8mal mehr als nötig. Da die Grafikkarte alle diese Dreiecke berechnen und an den Bildschirm ausgeben muss braucht man mit steigender Anzahl Polys, auch Polycount genannt, auch entsprechend mehr Rechenleistung. Daher sollte man beim modellieren möglichst auf Tricks zurückgreifen, womit man den Polycount ohne großen Detailverlust verringern kann. Das soll jetzt aber zumindest nicht Teil dieses Abschnitts sein, sondern nur eine Erwähnung am Rande.
    Im GE kann man sich den Polycount von Objekten anzeigen lassen. Es ist interessant sich das mal anzugucken, ohne Erfahrung kann man dadurch aber nicht unbedingt auf die Performance eines Mods/einer Map schließen. Da spielen auch die Texturen eine nicht unerhebliche Rolle. Generel gilt aber: je mehr Polys, umso mehr Leistung wird benötigt, je mehr und je größer die Texturen, umso mehr Leistung wird benötigt.

    Im Screenshot zu sehen: Die blauen Würfel im Scenegraph kennzeichnen die Shapes, oder auch Objekte. Rechts oben neben dem Senegraph ist der Polycount zu sehen, das ist der Wert bei "Triangles". Rechts im Attributes-Fenster ist das Feld für die CD zu finden.



    -Was sind ClipDistances und warum sollte man diese anpassen?
    Die Entfernung bis welche ein Objekt dargestellt wird wird als ClipDistance (nachfolgend mit CD abgekürzt) genannt. Die Frage, warum man diese anpassen sollte wurde eigentlich schon im vorherigen Abschnitt erklärt. Je mehr Objekte von der Grafikkarte dargestellt werden müssen, umso mehr Polys müssen berechnet werden. Je mehr Polys berechnet werden müssen, umso stärker muss die Grafikkarte sein, um flüssig spielen zu können. Da Leistung aber nicht unendlich ist und Objekte oftmals sowieso nicht von überall auf der Map zu sehen sind (weil diese z.B. hinter Hügel/Berge oder andere Objekte versteckt sind) sollte man die CDs angemessen einstellen. Das spart sehr viel Leistung, spätestens wenn man selbst einmal bei einer Map die CDs eingestellt hat versteht man, wie wichtig das ist. Maps, die man vorher überhaupt nicht spielen konnte kann man jetzt möglicherweise vollkommen flüssig spielen.



    -ClipDistances: So passt man diese sinnvoll an
    Gleich vorweg: "sinnvoll" ist hier ein relativer Begriff. Es spielen viele Faktoren eine Rolle: Ist die Map flach, hügelig, oder doch eher bergig? Wurden viele Details verbaut? Wie ist der Polycount der Objekte? Welche Abmessungen haben die Objekte? Wurde ein LOD (Erklärung folgt später) für Objekte verwendet? Außerdem spielt die persönliche Meinung und vor allem die Erfahrung eine sehr große Rolle. Ich gehe also nachfolgend von meiner Meinung und meiner Erfahrung aus. Hier kann man auch nicht viel falsch machen, sofern man im gewissen Rahmen bleibt und Proportionen beachtet. So ist die Standardmap z.B. 2048*2048m groß, eine CD von über 2896m (die Diagonale der Map) verhält sich also exakt wie eine CD von 1mio (der Standardwert).
    Generell gilt: je kleiner ein Objekt, umso kleiner sollte die CD sein. Für kleine Deko-Objekte wie Blumenkübel, Straßenschilder, Leitpfosten etc reicht eine CD von bis zu 150. Für etwas größere Objekte wie z.B. Zäune reichen 200 aus. für kleine Gebäude wie z.B. Hütten, Baucontainer oder kleine Unterstände ist eine CD von 300 oder 350 angemessen. für größere Gebäude sind bis zu 500 sinnvoll. Nur für ganz große Gebäude macht eine CD bis 600 Sinn. Für Bäume sind je nach Größe und Anzahl eine CD von 400-600 angemessen, mit LOD ist auch 800 kein Problem. Für ganz große Objekte wie Hochspannungsleitungen oder Windmühlen kann man auch mal 800 oder gar 1000 verwenden, sofern man die Map da nicht grade mit voll gekleistert hat und diese nicht grade zig tausende Polys haben.
    Bei flachen Maps macht es möglicherweise Sinn diese Werte etwas zu überschreiten, während mein bergige Maps eventuell sogar etwas weniger schon ausreicht. Für Objekte mit LOD kann man problemlos das 1.2 - 1.5fache einstellen und ist dabei idR sogar noch deutlich performanter als ohne LOD.
    Auch für normale Mods sollte man die CD setzen. Wenn z.B. ein Trecker mit Grubber am anderen Ende der Map beschäftigt ist macht es gar keinen Sinn dafür die Grafikkarte unnötig rechnen zu lassen, in den meisten Fällen sieht man den Trecker eh nicht. Für kleine Geräte wie Grubber, Mähwerke etc ist eine CD bis 300 sinnvoll, für größere Geräte wie Anhänger, Trecker, Selbstfahrer etc ist bis 500 sinnvoll. Wenn man da alles einheitlich haben will guckt man sich einfach die standard Maschinen an und setzt die CD beim Mod-Gerät so wie sie beim Standardgerät ist.



    -Tipps & Tricks: Mit Notepad++ schnell viele ClipDistances anpassen
    Wenn man viele gleiche Objekte hat, oder viele Objekte, die die gleiche CD bekommen soll kann man das schnell mit Notepad++ machen. Man kann jeden beliebigen Texteditor mit "Ersetzen"-Funktion benutzen, da Notepad++ aber der mit Abstand beste Editor ist erkläre ich es anhand davon. Bei anderen Programmen kann es etwas anders aussehen, das Prinzip ist aber das Gleiche.
    Voraussetzung ist eine TransformGroup (nachfolgend TG genannt), wo die Objekte drin sind, die die gleiche CD bekommen sollen (sind natürlich auch mehrere TGs möglich). Beispiele wo sowas oft vorkommt sind Bäume, Zäune und Hecken. Man öffnet die Map mit dem GE, sucht sich die TG mit den Objekte, wo die CD angepasst werden sollte und exportiert diese nun über "Export Selection" als i3d in dem gleichen Ordner, wo auch die map01.i3d ist. Nun öffnet man die exportierte i3d mit Notepad++ und sucht nach "clipDistance". Wird dies gefunden kann man mit der "Ersetzen"-Funktion ("Suchen -> Ersetzen ...", Shortcut STRG + H) die CD anpassen, indem man bei "Suchen nach" "clipDistance="CD_Wert"" eingibt und bei "Ersetzen durch" "clipDistance="neuer_wert"" angibt. Dann auf "Alle ersetzen" klicken und schon bekommt man die Meldung, wieviele Elemente ersetzt wurden. Jetzt die i3d speichern, die Map wieder mit dem GE öffnen, die alte TG löschen und die veränderte i3d importieren.
    Falls bei der Suche nach "clipDistance" nichts gefunden wurde heißt es, dass dieser den Standardwert von 1mio hat. Jetzt muss man das "clipDistance"-Attribut selbst einfügen, dazu geht man so vor: Bei der "Ersetzen"-Funktion bei "Suchen nach" gibt man "nodeId" ein und bei "Ersetzen durch" gibt man "clipDistance="CD-Wert" nodeId" an und klickt auf "Alle ersetzen" und schon bekommt man die Meldung, wieviele Treffer ersetzt wurden. Damit haben alle Objekte eine CD bekommen. Jetzt wieder die i3d speichern, Map mit dem GE öffnen, alte TG löschen und veränderte i3d einfügen.




    Fortsetzung folgt


    Quellen:
    http://forum.landwirtschafts-s…&t=40663&start=15#p330929
    http://forum.landwirtschafts-s…&t=42934&start=45#p353757
    http://forum.landwirtschafts-s…&t=42934&start=30#p350074

  • Echt gutes TUT, vielen Dank. :thumbsup:


    Jetzt hab ich auch endlich ne Erklärung, warum ich meine Map immer zerschossen habe, wenn ich die *distance.png´s in dds konvertiert habe... :D


    Eins habe ich aber noch:


    In Photoshop hat man 2 DTX1 Formate. Einmal mit und einmal ohne Alpha.


    Vielleicht hast Du da ein Tip, welcher der beiden Formate bevorzugt werden soll (nach meinem Verständnis sollte es ohne Alpha sein... :?: )



    mfg


    Norderland

  • super Sache, vielen Dank für deine Arbeit... haben sich meine ganzen Annahmen bestätigt ;)


    zwei kleine Fragen noch:


    -wie wirkt es sich auf die Darstellung/Performance aus, wenn die Normal/specular-maps z.B. nur die halbe Seitenlänge wie die Haupttextur haben? Kostet das mehr Performance, oder ist das besser weil die texturen kleiner sind?


    -brauchen Normal/Specular-maps auch mipmaps?

  • Die normalMap sollte genauso groß wie die diffuseMap sein (ist aber in einigen Fällen nur halb so groß, wieso weiß ich auch nicht), die specularMap ist zumindest bei den Modellen von Giants in den allermeisten Fällen nur halb so groß.
    Beide sollten auch MipMaps haben.

  • grüß dich bassaddict,


    hier ich hab irgendwie probleme bei den CD´s anpassen :huh:
    und zwar hab ich soweit alles gemacht, wie du es beschrieben hast jedoch sieht das bei mir etwas anders aus.


    <Scene>
    <TransformGroup name="baumgruppe1" clipDistance="500"
    <Shape name="g0" translation="671.621 97.9354 178.921" rotation="0 -43.1912 0" clipDistance="500"="3738" materialIds="517" shapeId="1" castsShadows="true" receiveShadows="true"/>
    <Shape name="g0" translation="690.929 95.7467 163.723" rotation="0 -43.1912 0" clipDistance="500"="3739" materialIds="517" shapeId="1" castsShadows="true" receiveShadows="true"/>
    <Shape name="g0" translation="704.587 93.7998 153.122" rotation="0 -43.1912 0" clipDistance="500"="3740" materialIds="517" shapeId="1" castsShadows="true" receiveShadows="true"/>


    probelem wird denke ich sein das er die werte (Rot makiert) nicht beim ersetzen ändert.
    Jetzt meine frage wie kann ich das am besten machen? da ich die baumgruppe1 nicht im GE öffenen kann.


    bedanke mich im voraus


    MfG


    BauerGosch :thumbup:

  • ehm ok, aber wie schon gesagt oben, wenn ich bei suchen nach nodeId und erstzen durch clipDistance="500"
    bleiebn die node id´s ja trotzdem & wenn ich es richtig verstehe braucht der GE diese ja nicht, sonst würde er mir die TG ja öffnen hmm...
    hab keine lust 500+ Bäume alle von Hand zu machen, gibs da ne möglichkeit diese ID´s zu ändern ?


    ps: hatt sich erledigt, ich hab mal wieder zu schnell gelesen ;)
    clipDistance="CD-Wert" nodeId


    klappt jetzt auch alles, danke noch mal für dein supper Tutorial



  • Bis auf ein paar Kleinigkeiten die sich bei der "Export All with Files"-Funktion geändert haben ist alles gleich geblieben. Aber die paar Kleinigkeiten wird man selbst auch noch wohl hinbekommen, sollte ja nicht schwierig sein rauszufinden, dass jetzt z.B. die Splines für Verkehr und Fußgänger und die Tiere direkt in der i3d der Map sind anstatt in einer eigenen i3d.

  • Vielen Dank erstmal für das Tutorial, bin gerde dabei es umzusetzen und is echt super aufgebaut, klappte soweit auch alles problemlos!


    Nur stellt sich mir eine kleine Frage bzgl. der MipMaps:
    Spielt es eine Rolle, welchen Wert die MipMap (außer für Hud-Texturen) hat bzw. weclher Faktor dort steht, also ist 1/3 besser als 1/10 oder is nur das Vorhandensein einer MipMap notwendig?
    Denn manche Texturen aus der Standard-Map haben z.B. bei MipMap 1/3, während andere aus der Standardmap wiederum 1/10 haben und wenn ich die 1/3 nochmal neu speichere, bekommt se auch nen kleineren Faktor, z.B. 1/8 und da stellst sich mir jetzt die Frage, ob es sich lohnt diese nochmal neu zu speichern?



    Ne Kleinigkeit is mir noch beim Exportieren aufgefallen:
    Ich habe nen Rolltor mit entsprechendem Skript in meine Map eingefügt und des Skript in nen neuen, selbsterstellten Unterordner in der Map reingepackt.
    Dieser wurde beim Exportieren natürlich nicht mitgenommen (hab ich dann beim Testen als Fehler in der log.txt gesehen) und da wäre es vl ganz nützlich (da du ja bereits erwähnst, dass man manche Ordner/Dateien manuell kopieren muss), wenn du noch dazu schreibst, dass Skripte von Objekten in der Map nicht mitkopiert werden, damit man die dann net vergisst ;)

  • Das was dir da angezeigt werden sind die Anzahl MipMaps. Wenn man die automatisch generieren lässt sind standardmäßig alle vorhanden. Wieviele das genau sind hängt von der Auflösung ab. Wenn man die manuell erstellt kann man selbst ganz frei bestimmen, wieviele man erstellt. Ob es in der Optik oder Performance einen nennenswerten Unterschied gibt wage ich zu bezweifeln.



    Naja, Scripte sind ja auch nicht in der i3d eingetragen. Aber ich hab sowieso vor das Tuto nochmal zu überarbeiten und vor Allem zu erweitern, dann kann ich das dann nochmal extra mit reinnehmen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!