3D Modelloptimierung für mobile Endgeräte

Interaktive 3D Inhalte sind in der Technologiebranche gerade groß im Kommen – und das schließt natürlich mobile Endgeräte mit ein. Allerdings können Smartphones und Tablets meist nicht mit der Leistung eines Desktopcomputers oder einer Spielkonsole mithalten. Daher müssen 3D Modelle für mobile Endgeräte gut optimiert werden, damit sie super aussehen und natürlich auch funktionieren. In diesem Blogartikel möchte ich euch zeigen warum und wann diese Optimierungen nötig sind und wie sie funktionieren.

3D Optimization

 

Während moderne Smartphones und Tablets in punkto Grafikperformance meistens recht leistungsfähig sind, können sie mit Spielkonsolen und Desktop PCs trotzdem nicht mithalten. Wenn deine mobile App also aufwändige Modelle mit komplexen Oberflächen oder Materialien enthält, wirst du mit der Darstellung relativ bald Probleme bekommen. Außerdem ist es vermutlich auch eine gute Idee, nicht nur die neueste Generation von Geräten zu unterstützen, sondern deine App auch für ältere Smartphones und Tablets verfügbar und funktionsfähig zu machen.

Komplexe Modelle

Nicht selten sind schon 3D Modelle vorhanden, die für einen anderen Zweck erstellt wurden (z.B. CAD Modelle für die Produktion oder qualitativ hochwertige Modelle für Produktpräsentationen). Das Problem ist nur, dass diese Modelle in einer Echtzeit Augmented Reality App und damit auf mobilen Geräten nur schlecht (wenn überhaupt) funktionieren, weil sie einfach nicht für diesen Zweck ausgelegt sind. Meistens sind diese Modelle komplex, d.h. sie sind sehr detailliert (und bestehen aus zu vielen Polygonen oder Dreiecken für mobile GPUs) oder enthalten große Texturen (hohe Auflösung) und komplexe Materialien (viele Drawcalls / Batches). Aber diese 3D Modelle für die App komplett neu zu erstellen wäre ziemlich sicher eine Verschwendung von Ressourcen, weil es sehr wahrscheinlich länger dauern würde, als die bestehenden Modelle für mobile Geräte zu optimieren.

Andere Berechnungen (AR, physikalisch, …)

Wie toll wäre es, wenn die gesamte Leistung unserer Smartphones und Tablets für die Anzeige von 3D Grafiken verwendet werden würde? Leider wird das nicht passieren. Im Hintergrund passiert nämlich noch so einiges, das einen großen Teil der Leistung beansprucht. Bei Augmented Reality sind zum Beispiel viele aufwändige Berechnungen nötig um den Kamerastream zu tracken und die Position, Rotation und Größe der 3D Inhalte richtig darzustellen. Und das passiert alles noch bevor die 3D Inhalte überhaupt am Bildschirm angezeigt werden. Gib dann noch ein paar 3D Animationen, Echtzeit-Physik und vielleicht ein paar kleine Partikeleffekte dazu und dann kannst du dir sicher vorstellen, warum es nötig ist, deine 3D Modelle so gut wie möglich für die Leistung von mobilen Geräten zu optimieren.

Wann?

Naja, natürlich immer – ist doch klar! Jedes Modell, das wir in unserer App nutzen, sollte so flüssig und gut wie möglich dargestellt werden. Allerdings macht es da natürlich einen Unterschied ob du deine 3D Modelle extra erstellst oder bestehende Daten optimierst. Im ersteren Fall musst du dich bei der Erstellung deines Modells „nur“ an die Richtlinien für die Modelloptimierung halten (lies dafür einfach weiter bis zum ‚Wie‘ Abschnitt). Die Gänsefüßchen um das ’nur‘ verraten natürlich, dass das trotzdem ein sehr aufwändiger Prozess sein kann – abhängig von der Modellqualität die du anstrebst. Wichtig: Die Optimierung für mobile Geräte ist kein Nebengedanke. Sie geht nicht einfach so mit nachdem das Modell fertig ist, sondern sollte während des gesamten Erstellungsprozesses mitbedacht werden.

Wenn du schon existierende Modelle optimierst, fallen sie vermutlich in eine der folgenden 3 Kategorien:

CAD Modelle

3D Modelle die mit einem CAD Programm erstellt wurden, bestehen meist aus parametrischen (mathematischen) Formen. Im Gegensatz dazu können 3D Engines nur Polygon-basierende / triangulare 3D Modelle anzeigen. Daher ist der erste wichtige Schritt um bestehende Modelle nutzbar zu machen die Konvertierung vom parametrischen (z.B. STEP, IGES; SLDPRT) zu einem triangularen Format wie STL oder FBX. Als erstes solltest du natürlich herausfinden, ob deine CAD Software ein triangulares Format exportieren kann. Falls nicht, dann musst du die Konvertierung natürlich manuell machen. Tools die hier meiner Meinung nach gut funktionieren sind Fusion360 oder das Open Source Programm FreeCAD. Für den Export hast du hier verschiedene Möglichkeiten, um die Qualität der Triangulation (die Konvertierung von parametrischen zu triangularen Formaten) zu beeinflussen. Achte auf eine Balance zwischen einer zu hohen Anzahl von Dreiecken und dem Verlust von zu vielen kleinen Details.

Photogrammetrische Modelle

Photogrammetrie ist der Prozess aus Photos automatisch 3D Modelle zu erstellen. Während die so entstehenden Modelle oft gut aussehen, haben sie auch eine sehr hohe Anzahl von Polygonen und besitzen sehr große Texturen. Natürlich muss ich es an dieser Stelle kaum mehr erwähnen, aber das ist ungefähr der schlechteste Fall den du dir für die Leistung auf mobilen Geräten vorstellen kannst. Außerdem sind sie auch nicht sehr gut geeignet für Animationen und daher muss ihre 3D Struktur meistens von Hand aufbereitet werden (weiter unten zeige ich dir wie das geht).

Film/VFX/nicht-Echtzeit Modelle

Modelle die für Film und Fernsehen, sowie für die Werbung und verschiedene andere Visualisierungen oder für den Druck erstellt wurden, haben hochaufgelöste Texturen und vermutlich auch komplexe Skelettstrukturen für Animationen. Das macht es eben unmöglich, sie für mobile Geräte so zu nutzen wie sie sind – sie müssen wie gesagt vorher noch etwas optimiert werden.

Wie?

Kurzum, hier ist was du tun musst, um deine 3D Modelle für mobile Geräte zu optimieren. Allerdings muss ich deine Erwartungen gleich wieder etwas senken – es gibt natürlich keine festen Regeln (ha, das wäre auch zu einfach, oder?).

Generell solltest du auf folgendes achten:

Polycount

Der Polycount (auch: Polygonanzahl) beschreibt die Anzahl der Polygone (oder Dreiecke) aus denen dein 3D Modell besteht. Das Ziel ist natürlich, diese Zahl so gering wie möglich zu halten und dabei die wichtigen Formen und Details so gut wie möglich zu erhalten. Eine Faustregel: Formen die zur Silhouette des Modells beitragen, sollten modelliert werden, während kleinere Details mit sogenannten Image Textures erstellt werden sollten.

Während es einige feststehende Zahlen gibt (z.B. das Unity Manual, das für mobile Spiele eine Modellkomplexität von 300-1500 Dreiecken pro Modell vorschlägt), ist die wahre Antwort auch hier wieder: „Kommt drauf an!“. Wenn du nur zwei Modelle auf einmal am Bildschirm hast, die ohne aufwändige Effekte auskommen, stört ein höherer Polycount sicher auch nicht. Wenn viele Modelle gleichzeitig in einer physikalischen Simulation verwendet werden, musst du die einzelnen Modelle vielleicht sogar weit unter 300 Dreiecke reduzieren. Wie es so oft der Fall ist: ein bisschen Erfahrung und ganz viel Ausprobieren und Testen bringt dir hier die besten Resultate.

Wenn du ein 3D Modell von Grund auf erstellst, kannst du natürlich optimal vorausplanen und auf den besten Polycount abzielen. Bei existierenden Modellen gibt es Mittel und Wege die Polygonanzahl zu reduzieren. Hier sind einige Beispiele:

Automatisch

Zum Glück gibt es einige automatisierte Algorithmen die ein Modell mit dem gewünschten Polycount aus deinem existierenden Modell erstellen. Bei den meisten statischen Modellen funktionieren diese Algorithmen gut genug. Beispiele dafür sind der “Quadratic Edge Collapse Detection” Filter von Meshlab (Open Source) und der “Decimate” Modifikator von Blender (Open Source).

Manuell

Die oben genannten Methoden reduzieren nur die Anzahl der Dreiecke, ohne auf die Mesh Struktur zu achten. Daher sind sie in den meisten Fällen nicht für animierte oder sich verformende (dynamische) Modelle geeignet. Für diese Zwecke gibt es elegantere Wege, den Polycount zu reduzieren: halbautomatische Algorithmen, mit denen du ‚Guides‘ erstellen kannst, die dir Kontrolle über das Endresultat geben. Beispiele dafür sind der Remesher by zBrush und das Autopo tool of 3DCoat.

Und die letzte Methode, die ich dir verrate gibt dir volle Kontrolle, braucht aber auch die meiste Zeit: die Neuerstellung des Modells mit einer niedrigeren Polygonanzahl. Dieser Prozess wird „Retopology“ genannt und kann entweder mit beliebten 3D Programmen wie Maya und Blender, oder mit einer eigens für diesen Zweck erstellten Software wie Topogun durchgeführt werden.

Materialien / Texturen

Das Ziel hier ist es, so wenige Drawcalls (oder ‚Batches‘) wie möglich zu haben. Das steht in engem Zusammenhang mit den Materialien und Shadern deiner Modelle: wenn du viele Modelle mit verschiedenen Materialien hast, sind viele Drawcalls nötig um sie am Bildschirm darzustellen. Für die Leistung wäre es natürlich viel besser, wenn alle Modelle im selben Drawcall angezeigt würden.

Wie kann das erreicht werden? Nun, wenn die meisten Modelle sich einen ähnlichen Shader teilen und sich nur durch die Texturen unterscheiden, dann kannst du dir überlegen, ob du nicht für alle denselben Shader verwenden und alle Texturen in einem großen Texture Sheet zusammenfassen möchtest. So ein Texture Sheet nennt man auch Texture Atlas und es kann dir einige Drawcalls sparen und damit einiges an Leistung bringen. Softwarebeispiele für diese Aufgabe sind der kommerzielle TexturePacker, der Open Source packer of libGDX und der Sprite Packer included with Unity3d.

Animationen

Leider gibt es für Animationen und Skelettstrukturen keine automatische Lösung – die musst du nach wie vor händisch optimieren. Einige Regeln die du dabei befolgen solltest:

+ Nutze in der Struktur so wenige Bones wie möglich. Versuche alle nicht deformierenden Teile, die du nach dem
Export in die Game Engine nicht mehr brauchst, loszuwerden
+ Fasse nicht mehrere Meshes in einer Skelettstruktur zusammen. Durch automatische Optimierungen an der
Anzeige der Animationen erzielst du eine viel bessere Leistung, wenn du alle 3D Modelle einer Animation zu
einem einzigen 3D Modell zusammenfasst, bevor du es an das Skelett (Rig) anheftest.
+ Benutz nicht zu viele Keyframes. Mach nur einen Keyframe aus Bones, die sich seit dem letzten Keyframe bewegt
haben, um die Größe der Animationsdatei gering zu halten.
+ Nutze “Baked Animations” für den Export in die Game Engine / Mobile App – so kannst du Constraints oder Inverse
Kinematics auch in Game Engines nutzbar machen.
+ Pro-Tip: Halte deine IK und FK Chains getrennt, sodass du die IK Bones löschen kannst, sobald die Animation
gebacken ist.

Yeah, gratuliere! Du hast es bis ans Ende geschafft! Mit diesen Infos sollte es dir möglich sein, schöne interaktive 3D Inhalte zu erstellen, die sogar auf älterer mobiler Hardware flüssig dargestellt werden. Sei dir nur bewusst, dass es stark von der jeweiligen Situation abhängt, welche Optimierungsmethode am besten geeignet ist. Aber natürlich werden alle Optimierungen die Leistung verbessern, aber manche eben mehr als andere 😉

cf-blog-achievement

Wenn du mehr über 3D Optimierung für mobile Geräte wissen willst, empfehle ich dir den folgenden Link: Unity Practical Guide to Optimization for Mobiles