Unity: Build für Android oder "Größe ist wichtig"

In einigen Fällen muss daran gearbeitet werden , die Baugruppengröße für Android zu reduzieren . Zum Beispiel kann die Installation schwerer APKs für mobile Internetnutzer einen hübschen Cent kosten. Das Überschreiten der APK-Größe von 50 MB bei Google Play führt zu zusätzlichen Schwierigkeiten beim Upgrade.



Wir haben ein 2D-Spiel für Android auf Unity entwickelt , das viele Bilder (die meisten mit Transparenzbereichen) und verschiedene Sounds enthält und mit dem Problem der Größe der APK konfrontiert ist. Mit Blick auf die Zukunft werde ich sagen, dass wir beim Lösen und Reduzieren des Gewichts um das 1,5-fache 1,5-mal mehr Downloads erhalten haben. Es bringt dich zum Nachdenken, nicht wahr?

Um das Problem der Schwergewichtsanwendungen zu lösen, haben wir uns einer wunderbaren Dokumentation zugewandtvon der Einheit. Es stellte sich heraus, dass dort dieses Thema nur am Rande diskutiert wird. Erwähnte genau, welche Aspekte die Größe der Baugruppe beeinflussen und wie diese Aspekte beeinflusst werden können, um die APK zu verkleinern, und gibt auch ein wenig Spezifität über die Einstellungen für den Import von Bildern.

Wir haben im Internet praktisch keine weiteren nützlichen Informationen zu diesem Thema gefunden. Aus diesem Grund haben wir eine kleine Studie durchgeführt, deren Ergebnisse wir gerne mit Ihnen teilen.

Der Dokumentation zufolge wird die Baugruppengröße also beeinflusst von :
  1. Asset-Größe (Bilder und Töne);
  2. Netze und Animationsclips;
  3. Die Größe der enthaltenen DLL.

Wir haben nicht mit Maschen und importierten Animationsclips gearbeitet, daher beginnen wir mit Assets.


BILDER


Klären Sie die Bilder. In unserem Spiel wird das Prinzip der Pixel-Perfektion respektiert . Alle Bilder ohne Alphakanal haben einen glatten Farbverlauf . Der Rest der Bilder ist transparent und die undurchsichtigen Bereiche weisen ebenfalls einen glatten Farbverlauf auf.

Lassen Sie uns analysieren, wie die PNG- und JPG- Bilder zur Größe des ARC beitragen .

PNG-Bilder


Für PNG hängt dieser Beitrag von zwei „Variablen“ ab:
  1. Die Größe des Bildes im Dateisystem;
  2. Einstellungen importieren.

Wir haben die drei Bilder in Photoshop Einstellungen gehalten: Kompressions-> Kleinste / Slow, Intrelaced: Nein . Das 295-KB-PNG-Bild nahm 236 KB Platz in der Baugruppe ein. Bild 612 KB dauerte 480 KB. Das 21,2-KB-Image benötigte 23 KB (natürlich mit denselben Importeinstellungen). Propositionalität ist offensichtlich.

Als Nächstes haben wir das erste Bild in Photoshop mit den folgenden Einstellungen gespeichert: Komprimierung-> Keine / Schnell, Intrelaced: Ja . Ich habe eine Datei mit einer Größe von 9000 KB erhalten, aber er hat der Assembly dieselben 236 KB hinzugefügt.

Dies bestätigt die Worte aus der Dokumentation, dass Unity alle Assets in das interne Format umcodiert.. Offensichtlich entspricht es in etwa dem in Photoshop gespeicherten PNG-Format mit den folgenden Einstellungen: Komprimierung-> Kleinste / Langsam, Intrelaced: Nein. Und Unity wandelt alle PNGs unabhängig vom ursprünglichen Dateiformat in dieses Format um.

JPG-Bilder


Die Experimente zeigten deutlich, dass JPG-Bilder proportional zu ihrer Größe zur Baugruppengröße beitragen . Es ist noch nicht klar, wie sich Unity verhält, wenn das Asset im JPG-Format vorliegt. Wir haben das gleiche (erste) Bild in JPG gespeichert und eine sehr kleine Datei im Dateisystem (75 KB) erhalten. In der Versammlung wurden jedoch exorbitante 767 KB (*) benötigt.

Wir haben ein Experiment mit einer großen Anzahl verschiedener Bilder durchgeführt, hier gebe ich nur einen kleinen Teil der Forschung. Im Gegensatz dazu konnten wir in anderen Experimenten die Gesamtgröße der Baugruppe reduzieren, indem wir alle Dateien von PNG in JPG konvertierten.
Die Gründe für dieses Phänomen sind noch nicht bekannt.
Höchstwahrscheinlich findet das interne Unity-Format wieder statt, die genauen Prinzipien der Interaktion des Hexen-Unity-Mechanismus mit JPG-Assets sind jedoch noch nicht geklärt.

Eine andere Möglichkeit, mit JPG zu arbeiten, wird unten beschrieben.

Schlussfolgerungen
  1. Anscheinend berücksichtigt Unity sowohl das Format, in dem das Bild gespeichert wird, als auch die Eigenschaften des Bildes und führt die Komprimierung nach einigen internen Prinzipien durch.
  2. Ein Prinzip ist absolut klar: Bilder im gleichen Format tragen zur Baugruppengröße bei, die direkt proportional (aber NICHT GLEICH) zu ihrer Größe im Dateisystem ist .

Die Importeinstellungen wirken sich genau wie im Dock beschrieben auf die Baugruppengröße aus (je besser das Bild, desto größer der Beitrag zur Baugruppengröße). Hier werden keine versteckten Merkmale aufgedeckt. (Es wurden noch keine Experimente mit anderen Bildformaten durchgeführt.)

SOUNDS


Für Sounds sind zwei Importeinstellungen wichtig: Audioformat und ForceToMono .

Dateien im WAV-Format belegen mehr Speicherplatz in der Assembly als Dateien im MP3-Format (der Beitrag zur Assemblygröße entspricht ungefähr der Dateigröße). Eine Stereo-WAV-Datei benötigt weniger Speicherplatz, wenn Sie ForceToMono = true festlegen . Genau der gleiche Effekt kann erzielt werden, wenn Sie die Datei bereits vor dem Import in „Mono“ konvertieren (dann ist ForceToMono im Inspektor nicht verfügbar).

Wenn Sie jedoch die Importeinstellung AudioFormat = Compressed für die WAV-Datei festlegen , nimmt diese in der Assembly so viel Speicherplatz ein wie die entsprechende MP3-Datei mit der höchsten Qualität (Audacity: variable Bitrate, 220-260 kbps). Das heißt, Unity codiert den Sound unabhängig im MP3-Format.

Für Dateien im gleichen Format gilt das Prinzip eines direkt proportionalen Beitrags zur Baugruppengröße.

Die verbleibenden Importeinstellungen wirken sich nicht auf die Baugruppengröße aus. Sie wirken sich auf den Speicherplatz aus, den Sound im RAM einnimmt.

JETZT AUF SPEZIFISCHEN SCHRITTEN ZU UNSEREM ZIEL


  1. Reduzieren Sie nach Möglichkeit die Größe und Qualität der Quellgrafikdateien .
    (1-a) Zuschneiden von Transparenzbereichen.
    In unserem Spiel wurden viele Bilder mit beeindruckenden Transparenzbereichen um das Bild verwendet. Transparenzbereiche erhöhen die Dateigröße nur um wenige Prozent und wirken sich nicht wirklich auf die Größe der Baugruppe aus (obwohl das Beschneiden von 102x ziemlich großen Bildern uns 2 MB erspart hat). Transparenzbereiche erhöhen jedoch die RAM-Nutzung (da dort die Bilder in BMP dargestellt werden).

    Daher der Rat: Um die Belastung des Arbeitsspeichers
    * zu verringern, vermeiden Sie große Transparenzbereiche in den Bildern.
    * Bilden Sie keine Atlanten mit großen Transparenzbereichen, insbesondere in NGUI.

    (Aber wir sind vom Hauptthema abgelenkt.)

  2. Für Bilder, die keine Transparenz haben und in höchster Qualität angezeigt werden, müssen Sie in den Importeinstellungen Erweitert-> RGB24 einstellen . RGBA32 macht für sie keinen Sinn, aber das Verlassen von Automatic Truecolor wird nicht empfohlen, da es (wie die Erfahrung gezeigt hat) vom System als RGBA32 wahrgenommen werden kann. Und dies ist völlig redundant, wenn keine Transparenzbereiche vorhanden sind (erhöht das Gewicht der Baugruppe und erhöht die Verwendung von RAM).
  3. Reduzieren Sie die Bildqualität in den Importeinstellungen gemäß dem Schema: 32 Bit -> 24 Bit -> 16 Bit, und stellen Sie sicher, dass die Bildqualitätsstufe im akzeptablen Bereich bleibt.
  4. Begrenzen Sie maxTextureSize für Bilder, für die dies möglich ist, und behalten Sie dabei eine akzeptable Qualität bei.
  5. Entfernen Sie nicht verwendete Assets in den Ressourcenordnern vor dem Erstellungsprozess vorsichtig manuell . Beachten Sie, dass Unity für Assets in den Ressourcenordnern diese NICHT automatisch löscht, selbst wenn sie nicht im Inspektor zugewiesen sind.
  6. Für JPG- Bilder : Ändern Sie die Dateierweiterung in Bytes und es wird TextAsset. Verwenden Sie dann die Funktion Texture2D.LoadImage () , um das Bild zu laden. Es ist zu beachten, dass diese Funktion den Prozessor lädt und möglicherweise nicht für große Bilder geeignet ist, die sehr schnell geladen werden müssen. Diese Methode erleichtert jedoch häufig die Montage auf beeindruckende Weise.
  7. Reduzieren Sie die Größe von Audiodateien auf die kleinstmögliche Größe (unter Berücksichtigung der Qualitätsanforderungen). Verwenden Sie nach Möglichkeit MP3, jedoch nicht WAV. Wenn Sie jedoch MP3s von höchster Qualität benötigen, können Sie die WAV-Datei auch mit den Importeinstellungen AudioFormat = Compressed verwenden (Unity codiert selbstständig neu). Verwenden Sie nach Möglichkeit Mono anstelle von Stereo. Setzen Sie für WAV-Dateien die Importeinstellung ForceToMono = true

Nach Abschluss jedes Elements ist es ratsam, den erzielten Effekt zu überprüfen. Weil das Verhalten der Einheit immer noch etwas Magie hat.

Ein paar Worte zu DLL


Das Dokument listet die DLLs auf, die notwendigerweise in der Assembly enthalten sind, und fordert die Minimierung der Anzahl zusätzlicher DLLs (insbesondere schwerer DLLs ). Verwenden Sie nach Möglichkeit insbesondere nicht System.dll (fügt der APK 2 MB hinzu). Selbst wenn wir Verweise auf Methoden aus dieser Bibliothek vermeiden, ist System.dll (ab Unity 4.5.5) weiterhin in der Assembly enthalten , da es von der obligatorischen Mono.Security.dll abgerufen wird. Daher stellt sich heraus, dass die offizielle Unity-Dokumentation an dieser Stelle nicht ganz relevant ist .

Die Verwendung anderer (optionaler) DLLs sollte jedoch vermieden werden, um die Baugruppengröße zu verringern.

Das ist alles für heute. Vielen Dank für Ihre Aufmerksamkeit!

(Bitte betrachten Sie dieses Material als mehr oder weniger systematische Ergebnisse der Studie und nicht als universellen Leitfaden für Maßnahmen. Ich freue mich sehr über Kommentare, Beobachtungen, konstruktive Kritik, Einwände, Vorschläge, Ergänzungen. Und natürlich bin ich unglaublich froh zu wissen, welche Methoden von Kollegen verwendet werden von anderen Unternehmen, um das zur Diskussion stehende Problem zu lösen.)

Jetzt auch beliebt: