Android "Evolution": wie es war



    Hallo allerseits! Mein Name ist Alexander Grishin, ich arbeite im IT-Territory Studio (Mail.Ru Group) als Testspezialist. Ich entwickle die Android-Version von Evolution: The Battle for Utopia. Das iOS-Publikum hat das neue Produkt in diesem Frühjahr mit Interesse kennengelernt und wir bereiten uns bereits auf die ersten Eindrücke von Android-Nutzern vor. In dem Artikel werde ich darüber sprechen, wie wir das Spiel auf Android portiert haben und auf welche Schwierigkeiten und Nuancen wir dabei gestoßen sind.

    "Evolution" auf iOS

    Wenn Sie sich Mobile Games im Allgemeinen ansehen, gibt es derzeit nur wenige Projekte auf dem Markt wie Evolution - groß, komplex, kostspielig und erfordert ein großes Team für die Entwicklung. Das Erstellen von Spielen mit so vielen Mechaniken, von denen jedes in der Tat ein separates Minispiel ist, ist ein langer und sorgfältiger Prozess: Sie müssen sie nicht nur erstellen, sondern auch verbinden, miteinander mahlen, sicherstellen, dass alles so funktioniert, wie es soll und soll verursachte das Benutzerinteresse, nicht Ratlosigkeit. Solche Spiele gibt es nur wenige, selbst unter iOS, für die Studios eher bereit sind, Spiele zu erstellen, und fast keine unter Android.

    Lyrischer Exkurs
    „Evolution“ wurde am 31. Januar 2014 in Russland veröffentlicht. Am 19. März wurde es auf der Game Developers Conference, die diesen Frühling in San Francisco stattfand, einem Weltpublikum vorgestellt. Am 2. April fand eine internationale Veröffentlichung statt. Das Spiel erreichte in 30 Ländern die Top Ten der besten Spiele für das iPad - und das trotz der Tatsache, dass Evolution fast zeitgleich mit dem Hearthstone-Studio Blizzard Entertainment auf den Markt kam, auf das sich die Fans freuten. Heute nehmen täglich mehr als 73.000 Spieler aus 198 Ländern am Spiel teil. Mehr als 41% der Spieler leben in Russland, mehr als 20% - in den USA sind es weitere 5,7% in Großbritannien.



    Komplexe Vielfalt

    Android ist eine bestimmte Plattform. Zunächst hat iOS nur fünf Bildschirmauflösungen, was natürlich die Anwendungsentwicklung erleichtert. Unter Android beträgt die Anzahl der Berechtigungen Hunderte, wenn nicht Tausende. Aus technischer Sicht ist das Zeichnen einer grafischen Oberfläche für diese Plattform an die Ecken gebunden. Aber manchmal dehnen sie es und zeichnen kein Pixel in ein Pixel - zum Beispiel Hintergründe, warum Grafiken leiden oder Proportionen verletzt werden. Unter iOS wissen wir immer, wie unser Bild aussehen wird. In Android ist alles andere als einfach.

    Auf dem Android-Gerätemarkt gibt es viele verschiedene Modelle mit unterschiedlicher Leistung. Hier ist es jedoch einfacher, die Installation auf verschiedenen Geräten zu steuern. Unter iOS ist es beispielsweise schwierig, die Geräte einzuschränken, auf denen die Anwendung ausgeführt werden kann. In der Anwendungsbeschreibung können Sie feststellen, dass das iPhone der vierten Generation dies nicht unterstützt. Gleichzeitig läuft es auf diesen Geräten, Sie können es spielen, aber im Prinzip garantiert niemand, dass es nicht herausfliegt oder etwas anderes nicht nach Plan tut. In Android können Sie bestimmte Geräte angeben, für die eine Person das Spiel herunterlädt, und viele Distributionen für verschiedene Grafikchips hochladen.

    Für iOS veröffentlichen wir eine einzige Distribution. Einige posten zwei, eine für Tablets und eine für Smartphones. Android benötigt verschiedene Distributionen, die je nach Chip, Texturkomprimierung und anderen Parametern zusammengestellt werden. In einigen Spielen müssen ungefähr 5-6 verschiedene Assemblys erstellt werden, was natürlich den Prozess der Bereitstellung der Anwendung verkompliziert. Wenn mehrere Distributionen für verschiedene GPUs erstellt wurden, laden wir diese auf Google Play hoch. Wenn der Client die Anwendung herunterlädt, wählt der Digital Store selbst den Build für die GPU des Geräts aus und gibt ihn aus.

    Alle iPhone-Grafikchips gehören zur selben PowerVR-Familie, sodass wir die Spieleleistung immer genau vorhersagen können. Unter Android gibt es vier gängige Grafikchips, die auf völlig unterschiedliche Weise funktionieren. Wir waren mit der Tatsache konfrontiert, dass die Anwendung auf dieser Plattform so langsam war, dass wir die Shader wiederholen, ihre Qualität reduzieren oder sie sogar deaktivieren mussten. In Android wird der Spekulator im Vertex-Shader und in iOS im Pixel-Shader berücksichtigt. Daher haben wir die Standardmethode zur Produktivitätssteigerung auf Kosten einer gewissen Bildverschlechterung angewendet - die Übertragung von Berechnungen vom Pixel-Shader auf den Vertex.

    Eine weitere Schwierigkeit, auf die wir beim Portieren von Evolution gestoßen sind: Android hat kein Texturkomprimierungsformat mit Alphakanal (ETC1 (4 Bit) gegenüber PVRTC4 / 2 (4/2 Bit mit Alpha), das mit allen Geräten kompatibel ist eine zusätzliche Verschwendung von Speicher und eine Vergrößerung der Anwendung, aber auch ein längeres Laden der Anwendung und ein Leistungsverlust Aus technischer Sicht stellt die fehlende Komprimierung von Texturen mit einem Alphakanal eine sehr, sehr große Einschränkung der Android-Plattform dar. Der OpenGL ES 2.0-Grafik-API-Standard. einzelnes ET-Format C1, das bereits veraltet ist und keinen Alphakanal enthält Auf iOS gibt es einen sehr guten Grafikchip: Neben der Tatsache, dass Texturen damit weniger Speicher belegen, werden sie auch schneller geladen. Wenn Sie Szenen mit vielen Texturen im Spiel überladen, auf iOS es passiert sofort aber auf Android mit einer spürbaren Verzögerung, die in unserem Fall 1,5 Sekunden erreicht. Leider musste ich mit dem arbeiten, was ist, oder Komprimierungsformate für eine bestimmte Hardwareplattform verwenden: PVRTC, DXT, ATC, ETC. Grundsätzlich planen die Android-Entwickler, das Komprimierungsproblem mit dem Alphakanal im folgenden OpenGL ES 3.0-Standard zu lösen: Es wird ein gutes, erweitertes Komprimierungsformat (ASTC) geben, und es wird für jeden sofort einfacher, zu leben.

    Dies sind die Hauptschwierigkeiten beim Portieren einer Anwendung von iOS auf Android. Es gab andere Probleme, wie zum Beispiel die Größenbeschränkung einer APK. Unter Android sind es 50 MB, während unter iOS Einschränkungen nur für das Herunterladen von Mobiltelefonen gelten. Die iOS-Version des Spiels ist eine einzelne Datei mit einer Größe von ca. 420 MB. Unter Android wird das Spiel in eine kleine APK-Datei unterteilt, die anschließend die große OBB-Datei herunterlädt, in der sich das Spiel befindet. Unity erledigt jedoch den größten Teil der Arbeit für Sie.



    Wie war es bei uns?

    Historisch gesehen können wir sagen, dass wir das Spiel hauptsächlich für Apple-Geräte entwickeln und dann portieren. Natürlich können Sie ein Spiel für zwei Plattformen gleichzeitig oder für drei entwickeln. "Juggernaut: Revenge of Sowering" zum Beispiel haben wir auch direkt unter dem Desktop-MAC oder OSX veröffentlicht.

    Die Portierung von iOS auf Android wird erheblich vereinfacht, wenn das Spiel unter Unity erstellt wird. Führen Sie es einfach auf einer neuen Plattform aus - und sofort wird klar, wo Sie die Datei durchgehen müssen und was getan werden muss, damit das Ergebnis normal aussieht. Wenn das Spiel nicht unter Unity ist, habe ich schlechte Nachrichten: Tatsächlich müssen Sie es erneut schreiben.

    Wir haben ungefähr zwei Monate gebraucht, um Evolution auf Android zu portieren. Wie gesagt, das Spiel ist sowohl für die Entwicklung als auch für die Portierung sehr komplex. Tatsache ist, dass es mehrere verschiedene Gameplay kombiniert. Charaktere bewegen sich auf der Karte, bekämpfen Monster, lösen Rätsel - jede dieser Klassen hat ihre eigene Benutzeroberfläche, ihre eigene Mechanik. Und natürlich wird all dieses Zeug direkt während der Spielsitzung geladen - das heißt, es war für uns wichtig, dass Evolution weiter "flog", nachdem es auf eine neue Plattform übertragen wurde.

    Das größte Problem, auf das wir stießen, bestand darin, die Kampfleistung des iOS-Spiels aufrechtzuerhalten. Um dies zu erreichen, haben wir neue Shader geschrieben, die die erforderliche Geschwindigkeit erhöhen und das Bild leicht verschlechtern. Wir haben es sogar geschafft, die "ehrlichen" Schatten der Charaktere zu retten! Es war praktisch nicht notwendig, grafische Elemente (Szenen, Modelle, Animationen) neu zu erstellen.

    Der zweite große (und noch zeitaufwendigere) Teil der Arbeit ist der 2D-Teil des Spiels, der in Evolution noch größer als 3D ist. Tausende von Android-Bildschirmauflösungen (nur wenige unter iOS) und das Fehlen eines so wunderbaren Texturkomprimierungsformats wie PVRTC (auf jedem iOS-Gerät verfügbar) führen zu einer Menge mühsamer Arbeit. In Evolution gibt es Dutzende von Bildschirmen, Hintergründen, Daumenkinoanimationen (Daumenkino) und Tausenden von Sprites, die in Dutzenden von Atlanten verpackt sind. Dann musste ich etwas komprimieren, dehnen, etwas umpacken.

    Mit all den Änderungen, die die Grafiken während des Portierens erfahren, ändert sich das Gewicht des Spiels - zum Schlechten für Android. Unter iOS werden Grafiken achtmal komprimiert. Es gibt einen wunderbaren PVRTC4-Algorithmus, mit dem Sie aus 32-Bit-Grafiken mit einem Alphakanal eine sehr anständige 4-Bit-Qualität erzielen können. Da nicht alle Grafiken unter Android so effizient komprimiert werden können wie unter iOS, wird mehr Speicherplatz benötigt.

    Viele, bei denen manuelle Abstimmung erforderlich war; Trotz der Tatsache, dass wir eine bestimmte allgemeine Lösung gewählt haben, war es notwendig, viele Dinge mit unseren Händen zu modifizieren. Zum Beispiel das bereits erwähnte Problem mit verschiedenen Bildschirmen: Ich musste dieses Feature von Android berücksichtigen und irgendwie die Situation lösen. Natürlich musste ich nicht für jeden möglichen Bildschirm alles neu schreiben. Unter iOS hatten wir nur zwei Skalen, die beide durch zwei teilbar waren - deshalb hatten wir keine besonderen Probleme mit der Verletzung von Proportionen und verschwommenen Grafiken. Android hat in der Regel eine bestimmte durchschnittliche Auflösung und alles andere ist dafür skaliert. Das Ändern der Auflösung wirkt sich hauptsächlich auf das zweidimensionale Diagramm aus: Wir haben verschiedene Oberflächenelemente, Schaltflächen usw. Ich musste diese Details manuell sortieren, Texturen klemmen und die Größe von Grafikelementen in der Hauptoberfläche ändern.

    Insgesamt haben wir vier Distributionen für Evolution erstellt. Später mussten wir jedoch einen von ihnen aufgeben - das Spiel unterstützt Tegra noch nicht. Im Allgemeinen ist das Portieren nach Tegra, insbesondere von älteren Generationen, ein Abenteuer. Wenn Leute ein grafisch intensives 3D-Spiel nach Tegra portieren können, gehen sie in der Regel zu einer professionellen Konferenz und erstellen einen Bericht darüber. Dies ist ein Schmuckstück und eine spezielle Arbeit, bei der ein Entwickler eine Erhöhung der fps von 10 auf 30 erreicht, indem er einfach die Reihenfolge ändert, in der verschiedene Objekte auf dem Bildschirm gezeichnet werden.



    Moderne mobile GPUs Luftbild

    Alle auf dem Mobilfunkmarkt präsentierten GPUs arbeiten etwas anders. Sie können in drei Klassen unterteilt werden: Tile-based Deferred Rendering (TBDR) - PowerVR; Tile-based Rendering (TBR) - Adreno, Mali und Instant Mode Rendering (IMR) - Tegra.

    PowerVR mit TBDR unterscheidet sich am meisten von IMR, der üblichen Desktop-Lösung. PowerVR funktioniert folgendermaßen: Es teilt den gesamten Bildschirm in kleine Kacheln mit einer Größe von 16 x 16 Pixel auf und zeichnet die gesamte Geometrie, die in diese Kachel gefallen ist. Dies geschieht im ultraschnellen Speicher des Chips. Während des Zeichenvorgangs werden alle Pixel verworfen, die im endgültigen Bild nicht sichtbar sind (z. B. durch andere undurchsichtige Objekte blockiert). Anschließend wird die Beleuchtung nur für die Pixel texturiert und berechnet, die genau auf dem Bildschirm sichtbar sind. Heutzutage ist es eine der wirtschaftlichsten und schnellsten Lösungen, und obwohl es einige Nachteile aufweist, ist es aus Sicht der Entwickler mobiler Spiele die optimalste. Von den offensichtlichen Vorteilen macht er sehr schnell Alpha-Blending, Antialiasing, Texturfilterung und völlige Unempfindlichkeit gegenüber der Reihenfolge des Renderns undurchsichtiger Objekte, Mip-Mapping usw. und das wunderbare Komprimierungsformat PVRTC reduzieren die Speicherlast weiter. Mit anderen Worten, Entwickler müssen nichts spezielles optimieren - Sie müssen lediglich ein bestimmtes Budget für die Anzahl der Eckpunkte einhalten, die Transparenz nicht missbrauchen und nicht den Alpha-Test verwenden, der den gesamten TBDR-Prozess unterbricht.

    IMR zeichnet alles mit nur ungefähren Optimierungen zum Abschneiden unsichtbarer Oberflächen (Early Z-Cull), daher ist es sehr empfindlich für die Renderreihenfolge von undurchsichtigen Objekten. Unity kann hier leider nichts ändern - der Entwickler muss herausfinden, welche Objekte in der Szene mehr Platz auf dem Bildschirm belegen, und Unity anweisen, sie zuerst zu zeichnen (Render-Warteschlange). Da alle Pixel verdeckt sind, erledigen Pixel-Shader mehr Arbeit.

    TBR-Chips funktionieren ähnlich wie IMR, teilen den Bildschirm jedoch in Kacheln auf, um die Speicherlast zu verringern.

    NVIDIA veröffentlicht weiterhin neue Typen, es wird bald Tegra K1 sein, dies ist also eine interessante Richtung, aber leider gibt es einen völlig anderen Ansatz, und aus diesem Grund wird es beim Portieren immer noch Unterschiede geben. Von kleinen Details: Wenn beispielsweise Mipmap auf allen Texturen in iOS deaktiviert ist, sinkt die Leistung um 2-3 fps. Wenn Sie dies unter Android tun, sinkt die Leistung um eine ganze Größenordnung. Es gibt viele dieser Feinheiten: Wenn Sie das Spiel für jeden der Chips optimieren möchten, sollten Sie sich mit ausführlichen Optimierungshandbüchern der Hersteller, ausführlichen Profilerstellungen und Experimenten befassen. Jemand macht diese Arbeit und liest dann den Bericht auf der Konferenz; Wir entschieden uns, nicht so tief zu graben, sondern wählten einfach die Liste der Geräte, für die wir Distributionen entwickeln wollten. hat das Ergebnis getestet und erfolgreiche Versionen in den Store hochgeladen. Leider kann nicht jeder Besitzer von Android-Geräten Evolution spielen, aber wir haben die maximal mögliche Anzahl von Geräten abgedeckt. Insgesamt unterstützt das Spiel ungefähr 1.000 Android-Mobilgeräte.

    Das ist die ganze Geschichte. Vielen Dank für Ihre Aufmerksamkeit, wenn Sie Fragen haben - fragen Sie in den Kommentaren, ich werde sie gerne beantworten.

    Jetzt auch beliebt: