Hero background image
Tipps zur mobilen Optimierung für technische Künstler – Teil I

Was Sie auf dieser Seite erhalten: Tipps zur Optimierung künstlerischer Elemente für Entwickler mobiler Spiele, die mit Unity arbeiten. Dies ist das erstezwei Artikelzur Optimierung von Grafiken für Handyspiele.

Viele weitere Tipps zur mobilen Optimierung finden Sie indiesem umfassenden E-Bookund diesem Unity Learn Kurs zur3D-Art-Optimierung für mobile Anwendungen.

3D-Rendering eines Robotercharakters
Konzentrieren Sie sich auf die Silhouette

Sowohl Polygone als auch Eckpunkte verursachen auf mobilen Plattformen einen hohen Rechenaufwand. Platzieren Sie Polygone in Bereichen, die wirklich zur visuellen Qualität der Anwendung beitragen, damit Sie Ihr Verarbeitungsbudget nicht verschwenden.

Aufgrund der geringen Bildschirmgröße der meisten Mobilgeräte und der Position der 3D-Objekte in Ihrer Anwendung sind viele kleine Dreiecksdetails auf einem 3D-Objekt möglicherweise nicht sichtbar. Dies bedeutet, dass Sie sich auf große Formen und Teile konzentrieren sollten, die zur Silhouette des Objekts beitragen, und nicht auf kleine Details, die möglicherweise nicht sichtbar sind. Verwenden Sie Texturen und Normal Maps für feine Details.

LOD-Beispiele
Detaillierungsgrad (LOD) verwenden

Wenn sich Objekte in die Ferne bewegen, kann der Detailgrad (LOD) sie anpassen oder umstellen, um einfachere Netze mit einfacheren Materialien und Shadern zu verwenden und so die GPU-Leistung zu verbessern.

Weitere Tipps zur LOD-Vorbereitung

  • Entfernen Sie mehr Polygone auf flacheren Flächen und verwenden Sie keine dichten Dreiecksflächen auf Objekten mit einem niedrigeren LOD.
  • LOD kann auch auf die Shader-Komplexität angewendet werden. Shader und Material können für weiter entfernte 3D-Objekte optimiert werden. Sie können beispielsweise die Anzahl der Texturen reduzieren, die ein Objekt verwendet, wenn es sich von der Kamera entfernt.
  • Es lohnt sich oft, die Anzahl der Dreiecke zwischen den einzelnen LOD-Ebenen um 50 % zu reduzieren.
  • Überprüfen Sie, wie das LOD in unterschiedlichen Entfernungen von der Kamera aussieht.
  • Eine saubere Topologie ist für Charaktere und Objekte, die sich verformen oder animieren, von entscheidender Bedeutung.
  • Machen Sie sich nicht zu viele Gedanken über die perfekte Topologie. Der Spieler oder Endbenutzer sieht den Drahtrahmen eines 3D-Modells nicht, sobald Sie eine Textur und ein Material angewendet haben.

Wann Sie LOD nicht verwenden sollten

LOD ist nicht für jede Situation geeignet. Vermeiden Sie beispielsweise die Verwendung in einer Anwendung, in der sowohl die Kameraansicht als auch die Objekte statisch sind oder in der das Objekt bereits eine geringe Polygonanzahl verwendet. LOD bringt einen Speicheraufwand und eine größere Dateigröße mit sich, da Mesh-Daten gespeichert werden müssen, damit sie in Echtzeit verwendet werden können.

Okklusion in Unity
Kombinieren Sie Meshes und verbergen Sie Objekte

Sie können mehrere Meshes zu einem kombinieren, um die Anzahl der zum Rendern erforderlichen Draw Calls zu reduzieren. Um diese Technik anzuwenden, erstellen Sie in der Hierarchie ein leeres GameObject und machen Sie es zum übergeordneten Objekt der Meshes, die Sie kombinieren möchten. Fügen Sie dann ein Skript, das die Methode Mesh.CombineMeshes() implementiert, an das übergeordnete GameObject an.

Occlusion Culling verwenden

Hinter anderen Objekten verborgene Objekte können möglicherweise weiterhin gerendert werden und Ressourcen kosten. Verwenden Sie Occlusion Culling, um sie zu verwerfen.

Während das Frustum-Culling außerhalb der Kameraansicht automatisch erfolgt, handelt es sich beim Occlusion-Culling um einen eingebrannten Prozess. Markieren Sie Ihre Objekte einfach als „Statische Okkluder“ oder „Statische Okkludente“und backen Sie sie dann über das Dialogfeld „Fenster“ > „Rendering“ > „Okklusionsausblendung“ . Obwohl es nicht für jede Szene notwendig ist, kann das Culling in vielen Fällen die Leistung verbessern. Weitere Informationen finden Sie im Tutorial „Arbeiten mit Occlusion Culling“ .

Importieren von Modellen in Unity
Modelle importieren

Hier sind einige gute Tipps, die Sie beim Importieren Ihrer Modelle beachten sollten.

  • Animationstyp: Wenn Sie ein FBX-Mesh importieren, das keine Animationsdaten enthält, legen Sie den Animationstyp auf der Registerkarte „Rig“ der Importeinstellungen auf „Keine“ fest. Wenn Sie Ihr Mesh in die Hierarchie einfügen, stellt diese Einstellung sicher, dass Unity keine ungenutzte Animator-Komponente generiert.
  • Rigs und BlendShapes deaktivieren: Wenn Ihr Mesh keine Skelett- oder Blendshape-Animation benötigt, deaktivieren Sie diese Optionen nach Möglichkeit.
  • Normalen und Tangenten deaktivieren: Wenn Sie absolut sicher sind, dass das Netzmaterial keine Normalen oder Tangenten benötigt, deaktivieren Sie diese Optionen, um zusätzliche Kosten zu sparen.
  • Importeinstellungen Wenn Ihr Modell zur Laufzeit nicht geändert wird, deaktivieren Sie die Option „Lesen/Schreiben aktiviert“ auf der Registerkarte „Modell“ der Importeinstellungen, um zu verhindern, dass im Speicher eine Kopie erstellt wird.
  • Statisches/dynamisches Batching: Statisches Batching ist eine gängige Optimierungstechnik, die die Anzahl der Draw Calls reduziert. Es eignet sich ideal für Objekte, die aus einer großen Anzahl von Scheitelpunkten bestehen, die sich beim Rendern nicht bewegen, drehen oder skalieren. Überprüfen Sie „Statisch“ im Inspector, der den Mesh-Renderer Ihres Zielmodells enthält.
Vergleich der Texturkomprimierung
Texturgrößen und Farbraum

Texturen können unterschiedliche Größen haben. Durch die Reduzierung der Größe von Texturen, die weniger Details erfordern, lässt sich die Bandbreite reduzieren. Beispielsweise kann eine diffuse Textur auf 1024 x 1024 und die zugehörige Rauheits-/Metallkarte auf 512 x 512 eingestellt werden. Versuchen Sie nach Möglichkeit, die Texturgröße gezielt zu reduzieren und prüfen Sie stets, ob sich die visuelle Darstellung anschließend verschlechtert hat.

Die meisten Texturierungsprogramme arbeiten mit dem sRGB-Farbraum und exportieren Texturen mithilfe dieses Farbraums.

Wir empfehlen Ihnen, diffuse Texturen im sRGB-Farbraum zu verwenden. Texturen, die nicht als Farbe verarbeitet werden, dürfen nicht im sRGB-Farbraum liegen. Beispiele für diese Texturen sind Metall-, Rauheits- und Normalkarten, da Karten als Daten und nicht als Farbe verwendet werden. Die Verwendung von sRGB in diesen Karten führt zu einer falschen Darstellung auf dem Material.

Hinweis Stellen Sie sicher, dass die sRGB-Einstellung (Farbtextur) im Inspektorfenster keine Häkchen neben Rauheit, Glanzlicht, Normal Maps oder ähnlichen Elementen aufweist.

Details in der Textur auf Dachschindeln
Details in die Textur einbacken

Elemente wie Umgebungsverdeckung und kleine spiegelnde Glanzlichter können eingebrannt und dann der diffusen Textur hinzugefügt werden. Dieser Ansatz bedeutet, dass Sie sich nicht zu sehr auf rechenintensive Shader und Unity-Funktionen verlassen müssen, um spiegelnde Glanzlichter und Umgebungsverdeckung zu erzielen.

Demo einer getönten Graustufentextur
Getönte Graustufentexturen

Verwenden Sie wenn möglich Graustufentexturen, die eine Farbtönung im Shader ermöglichen. Dadurch wird Texturspeicher gespart, allerdings muss für die Tönung ein benutzerdefinierter Shader erstellt werden. Gehen Sie bei dieser Technik wählerisch vor, denn nicht alle Objekte sehen mit dieser Methode gut aus. Dies lässt sich leichter auf ein Objekt anwenden, das eine einheitliche Farbe aufweist.

Bilinearer und trilinearer Vergleich der Texturfilterung
Texturfilterung

Durch Texturfilterung wird häufig die Texturqualität einer Szene verbessert, sie kann jedoch auch die Leistung beeinträchtigen, da zum Erreichen einer besseren Texturqualität häufig mehr Verarbeitung erforderlich ist. Die Texturfilterung kann manchmal bis zur Hälfte des GPU-Energieverbrauchs ausmachen. Die Auswahl einfacherer und geeigneterer Texturfilter kann dazu beitragen, den Energiebedarf einer Anwendung zu senken.

  • Nächste/Punkt-Filterung: Dies ist die einfachste und rechenintensivste Form der Texturfilterung. Aus der Nähe betrachtet können Texturen durch diese Filterung jedoch blockförmig erscheinen.
  • Bilineare Filterung: Bei der bilinearen Filterung werden benachbarte Texel abgetastet und gemittelt, um Pixel in einer Textur einzufärben. Im Gegensatz zur Nearest-Filterung führt die bilineare Filterung zu weniger blockartigen Pixeln, da die Pixel einen gleichmäßigen Farbverlauf aufweisen. Ein Nebeneffekt der bilinearen Filterung besteht darin, dass Texturen bei näherer Betrachtung unscharf erscheinen.
Sprite Atlas im Unity-Editor
Texturgrößen und Farbraum

Der größte Teil Ihres Speichers wird wahrscheinlich für Texturen verwendet, daher sind die Importeinstellungen hier von entscheidender Bedeutung. Versuchen Sie beim Importieren Ihrer Assets grundsätzlich, diese Richtlinien zu befolgen.

  • Verringern Sie die maximale Größe: Verwenden Sie die Mindesteinstellungen, die optisch akzeptable Ergebnisse liefern. Dies ist zerstörungsfrei und kann Ihren Texturspeicher schnell reduzieren.
  • Verwenden Sie Zweierpotenzen (POT): Unity erfordert POT-Texturdimensionen für mobile Texturkomprimierungsformate (PVRCT oder ETC).
  • Atlas Ihre Texturen: Das Platzieren mehrerer Texturen in einer einzigen Textur kann die Anzahl der Draw Calls verringern und das Rendering beschleunigen. Verwenden Sie den Unity Sprite Atlas oder den TexturePackereines Drittanbieters, um Ihre Texturen zu atlasieren.
  • Deaktivieren Sie die Option „Lesen/Schreiben aktiviert“: Wenn diese Option aktiviert ist, wird eine Kopie sowohl im CPU- als auch im GPU-adressierbaren Speicher erstellt, wodurch der Speicherbedarf der Textur verdoppelt wird. Lassen Sie diese Option in den meisten Fällen deaktiviert. Wenn Sie Texturen zur Laufzeit generieren, erzwingen Sie dies über Texture2D. Anwenden, wobei makeNoLongerReadable auf truegesetzt wird.
  • Deaktivieren Sie unnötige Mipmaps: Mipmaps werden nicht für Texturen benötigt, die auf dem Bildschirm eine einheitliche Größe behalten, wie etwa 2D-Sprites und UI-Grafiken. Lassen Sie Mipmaps für 3D-Modelle mit unterschiedlichem Abstand zur Kamera aktiviert.
  • Bilineare Filterung verwenden: Dies hilft, ein Gleichgewicht zwischen Leistung und Bildqualität zu erreichen.
  • Trilineare Filterung gezielt einsetzen: Es erfordert mehr Speicherbandbreite als die bilineare Filterung.
  • Verwenden Sie bilineare und 2x anisotrope Filterung: Wählen Sie diese anstelle von trilinear und 1x anisotrop, um sowohl das Erscheinungsbild als auch die Leistung zu verbessern.
  • Halten Sie das anisotrope Niveau niedrig: Verwenden Sie für kritische Spielressourcen nur eine Ebene höher als 2.
Komprimierter Texturvergleich
Texturen komprimieren

Verwenden Sie Adaptive Scalable Texture Compression (ATSC) für iOS und Android. Die überwiegende Mehrheit der in der Entwicklung befindlichen Spiele zielt auf Geräte mit Mindestspezifikationen ab, die ATSC-Komprimierung unterstützen. Die einzigen Ausnahmen sind:

  • iOS-Spiele für Geräte mit A7 oder niedriger (z. B. iPhone 5, 5S usw.): Verwenden Sie PVRTC
  • Android-Spiele für Geräte vor 2016: Verwenden Sie Ericsson Texture Compression (ETC2)
Texturkanäle
Verwenden Sie Texturkanäle, um mehrere Texturen in eine zu packen

Durch das Packen von Texturkanälen lässt sich Texturspeicher einsparen, da Sie drei Maps in einer Textur unterbringen können. Dies bedeutet weniger Texture-Sampler. Dieser Ansatz wird häufig verwendet, um Rauheit, Glätte und/oder Metall in einer Textur zu packen. Es kann auch auf jede Texturmaske angewendet werden. So lässt sich beispielsweise auch die Alphamaske hinterlegen. Bilder mit Transparenzen können einen größeren Speicherbedarf haben, da sie ein 32-Bit-Format erfordern. Indem Sie jedoch den freien Kanal zum Speichern der Alphamaske verwenden, können Sie die diffuse Textur bei 16 Bit belassen und die Dateigröße effektiv halbieren.

Nutzen Sie den grünen Kanal um die wichtigste Maske zu speichern. Der Grünkanal hat normalerweise mehr Bits, da unsere Augen empfindlicher auf Grün und weniger empfindlich auf Blau reagieren.

Manuelle UV-Textur in Probuilder
UV-Entpackung

Eine UV-Karte projiziert 2D-Texturen auf die Oberfläche eines 3D-Modells. Unter UV-Unwrapping versteht man den Vorgang der Erstellung einer UV-Karte.

  • Es empfiehlt sich, UV-Inseln (die einzelnen Einheiten einer ausgepackten Textur) so gerade wie möglich zu halten, um das Packen von UV-Inseln zu erleichtern und Platzverschwendung zu vermeiden. Ein gerades UV hilft auch, den Treppeneffekt auf Texturen zu verhindern.
  • Auf mobilen Plattformen ist der Texturplatz begrenzt. Daher ist die Texturgröße normalerweise kleiner als auf einer Konsole oder einem PC. Eine gute UV-Verpackung stellt sicher, dass Sie die höchste Auflösung aus Ihren Texturen herausholen.
  • Erwägen Sie, ein leicht verzerrtes UV zu verwenden, indem Sie das UV gerade halten, um Texturen von besserer Qualität zu erhalten.
  • In bestimmten Fällen müssen Sie die Kanten und Schattierungen übertreiben und hervorheben, um die Lesbarkeit der Form zu verbessern. Da mobile Plattformen im Allgemeinen kleinere Texturen verwenden, kann es schwierig sein, alle erforderlichen Details in diesem kleinen Raum zu erfassen.
  • Verwenden Sie für mobile Anwendungen weniger Texturen und integrieren Sie alle zusätzlichen Details in eine Textur. Dies ist wichtig, da einige Details besser in die diffuse Textur selbst eingebrannt werden, um sicherzustellen, dass diese Details auf den kleinen Mobilbildschirmen sichtbar sind.
Haben Ihnen diese Inhalte gefallen?