Fortnite

Veröffentlichung von Fortnite auf Android – Technisches Blog

6.9.2018
Von Das Fortnite-Team

INTRO

Am 9. August haben wir die Android-Beta von Fortnite auf ausgewählten Geräten unserer Partner von Samsung gestartet. Einige Tage später haben wir damit begonnen, Einladungen an weitere Besitzer von Android-Geräten verschiedener anderer Mobiltelefon-Hersteller zu versenden. Wir haben einiges aus der Beta gelernt, was die Leistung, Sicherheit und Kompatibilität von Geräten sowie die Bereitstellung von Fortnite unter Android mit dem Fortnite Installer angeht. Beschäftigen wir uns einmal näher mit den zur Veröffentlichung nötigen technischen Einzelheiten und damit, woran wir arbeiten und wo wir Android in naher Zukunft sehen. 

STATISTIKEN

In den ersten 21 Tagen seit Fortnites Veröffentlichung unter Android war das Interesse unglaublich hoch. Mehr als 23 Millionen Spieler haben sich für unsere Android-Beta angemeldet und mehr als 15 Millionen Spieler haben unser APK installiert.  Obwohl wir uns noch in der Einladungsphase für Android befinden, ist unser Durchsatz an Spielern, die zum Spiel eingeladen werden, vergleichbar mit dem für die iOS-Beta. 
 

HARDWARE OPTIMIERUNG 


Technisches

Das Spiel für alle Plattformen zu portieren und die plattformübergreifende Spielbarkeit zu unterstützen, war eine einzigartige Herausforderung. Normalerweise vereinfacht man Inhalte und Design etwas, wenn man versucht, ein Spiel für mobile Geräte etwas herunter zu skalieren, um den Leistungsbeschränkungen der Plattform gerecht zu werden. Man kann beispielsweise Objekte, die sich näher an der Kamera befinden, ausblenden, um sogenannte „Draw Calls“ zu reduzieren. In Fortnite können Spieler mit ihren Freunden am PC oder der Konsole dasselbe Match spielen, also müssen wir alles Relevante für das Gameplay rendern.

Der Pfad bis zur Veröffentlichung unter Android

Seit Januar 2018 haben wir mit einem beträchtlichen Team hart an der Android-Version für FNBR gearbeitet. Ein großer Teil unserer Arbeit, um dies zu ermöglichen, steckt in der Render-Performance, Stabilität und Speicherung – aber die gewaltige Zahl und Vielfalt von Android-Hardware, OS- und Treiberversionen war die größte Hürde, die es für uns zu überwinden galt.

Die Zusammenarbeit mit Partnern war unerlässlich, um Fortnite und Android zusammenzubringen. Ohne ihr Know-how, ihre Kompetenz und ihre harte Arbeit wäre das nicht möglich gewesen.

Wir arbeiten eng mit Samsung zusammen, um Fortnite für ihre Geräte anzupassen und zu optimieren. Samsung hat Techniker weltweit an verschiedene Standorte von Epic geschickt, direkt mit unseren Technikern an der Optimierung und den Performance-Analysen gearbeitet und viele Codeänderungen – insbesondere für den Vulkan-Renderer – beigetragen. Mithilfe eigens dafür ausgerüsteter Testphones und ihren hauseigenen Konstruktionswerkzeugen konnten sie uns einen Überblick darüber verschaffen, wo unsere Leistungs- und Speicherengpässe lagen und wie wir damit umgehen müssen. Wir haben außerdem mit Samsung daran gearbeitet, den Installationsprozess für Nutzer von Samsung Mobilgeräten so reibungslos und sicher wie möglich zu gestalten.

Techniker von Google haben uns ebenfalls vor Ort besucht, um Fortnite zu optimieren und uns dabei zu helfen, wichtige Verbesserungsmöglichkeiten und Speicherverluste zu identifizieren und gemeinsam mit uns ein solides Frame Pacing für OpenGL unter Android zu implementieren. Die Android-Techniker von Google sind sehr begabt und arbeiten voller Leidenschaft daran, fantastische Spielerlebnisse in der Android-Umgebung zu bieten und diese ständig zu verbessern.

Zusätzlich konnten wir mit vielen weiteren Partnern an Tests und Verbesserungen für Fortnite arbeiten, wie beispielsweise ARM, Qualcomm, Imagination Technologies, Razer, HiSilicon und vielen anderen.
 

Fragmentierung

Die Android-Produktreihe besteht aus Mobilgeräten verschiedenster Hersteller. Jedes Phone wird um ein sogenanntes „System-on-Chip“ (SOC) herum aufgebaut, zu dem auch CPU- und GPU-Kerne gehören. Es gibt diverse SOCs, die weit verbreitet sind, wie z. B. Snapdragon von Qualcomm (71 % der momentan unterstützten Geräte), das eine Adreno GPU enthält, Exynos von Samsung, die MT-Reihe von MediaTek und die Kirin-Reihe von HiSilicon, die alle mit ARM Mali GPUs arbeiten. Jedes Gerät wird mit einer leicht abweichenden Version des Android-Betriebssystems ausgeliefert, und die meisten Hersteller passen die Ablaufsteuerung und Energieverwaltung an ihre Anforderungen an. Geräte mit der gleichen GPU werden also mit verschiedenen Grafiktreiberversionen ausgeliefert. Das Ergebnis ist, dass zwei Geräte mit derselben zugrunde liegenden Hardware sehr verschiedene Leistungsmerkmale aufweisen und für unterschiedliche Fehler anfällig sein können.

Wir waren angenehm überrascht, als wir feststellten, dass es wesentlich einfacher war, die jüngste Version von Android zu übernehmen, als wir es für 0 – 2 Jahre alte Geräte erwartet hätten. Im Moment sehen wir bei den höheren Geräteanforderungen in unserer Beta, dass mehr als 92 % der Fortnite-Nutzer Android 8 (Oreo) oder neuer nutzen, ~8 % sind noch bei Android 7 (Nougat) und weniger als 0,5 % nutzen Versionen, die 2015 oder früher herausgekommen sind. Bei Geräten, die zwei Jahre oder älter sind, gibt es einen deutlich niedrigeren Anteil. Für diese Geräte müssen Hersteller angepasste Updates herausbringen, und in den meisten Fällen müssen sie die Entwicklung und Veröffentlichung mit den verschiedenen Mobilfunkanbietern weltweit abstimmen.

Um diese Vielschichtigkeit bewältigen zu können, benutzen wir das hierarchisch angeordnete Gerät-Profilsystem der Unreal Engine. Wir beginnen, indem wir unsere Leistungsprofile erstellen: Niedrig, Mittel, Hoch und Episch. Diese Profile passen die Skalierbarkeitseinstellungen in der Engine an, wodurch das Spiel auf Geräten mit unterschiedlichen Leistungsmerkmalen laufen kann. Auf niedriger Stufe werden Betrachtungsabstände weitestgehend verringert und alle wählbaren Grafikfunktionen deaktiviert. Auf episch ist alles eingeschaltet: Schatten, Laub und der größtmögliche Betrachtungsabstand, der auf den neuesten Geräten möglich ist.

Zusätzlich haben wir einen Satz GPU-Profile, z. B. Adrena 54x und Mail G72. Diese GPU-Profile wählen ein Leistungsprofil, das am besten zur Kapazität der Hardware passt und erlauben es uns, Verbesserungen und Lösungen für diese bestimmte Hardware zu erarbeiten. Schließlich gibt es noch einen Satz gerätespezifischer Profile, wie beispielsweise Samsung Galaxy Note 9 Adreno und Google Pixel 2 XL. Diese letzte Ebene von Geräteprofilen erlaubt es uns, weitere Lösungen und Optimierungen auf bestimmten Geräten zu erarbeiten, wenn sie notwendig sein sollten. Zu Beginn betrachten wir uns Eigenschaften wie Modell, OS-Version und Grafiktreiberversion, um festzustellen, welches Geräteprofil Verwendung findet.
 

Render-Performance

Die CPU-Leistung beim Rendern war bei weitem der größte Engpass bei der Aufrechterhaltung einer soliden Framerate. Im Vergleich zu PC, Konsole und iOS wird bei Android deutlich mehr CPU-Zeit für den Grafiktreiber benötigt. Die jüngsten Android-Geräte, wie die Adreno-Version des Galaxy S9, können weit mehr als 1.500 Draw Calls pro Frame verarbeiten, aber ältere Geräte bringen es auf weit weniger. Im mittleren Leistungssegment, das wir unterstützen, müssen im Durchschnitt etwa 600 Draw Calls bewältigt werden, am unteren Ende muss der Durchschnitt bei etwa 400 liegen.

Wir hatten die Zahl der Objekte, die wir pro Frame rendern müssen, bereits auf ein Mindestmaß reduziert, als wir Anfang des Jahres für iOS ausgeliefert haben. Also mussten wir andere Wege gehen. Wir haben damit experimentiert, Draw Calls dynamisch zu instanzierten Draw Calls zusammenzufassen. Das brachte uns allerdings nicht den erhofften Zuwachs, um dies zu dem ohnehin komplizierten Code hinzuzufügen.

Einige Optimierungen in unserem OpenGL-Renderer brachten leichte Zugewinne, aber unser größter Zuwachs war eine Überraschung, die bei einer unserer Speicheroptimierungen auftauchte: emulierte Uniform Buffer. Diesen Codepfad unterstützt die Unreal Engine 4 seit Jahren, und er wird für OpenGL ES2-Geräte verwendet, die keine native Unterstützung für Uniform Buffer (auch kontinuierliche Buffer genannt) verwenden. Das funktioniert folgendermaßen: Bei der Shader-Erfassung identifizieren wir alle Konstanten, die für einen Shader nötig sind, und packen sie in eine Gruppe, die der Shader ausliest. Außerdem speichern wir eine Zuordnungstabelle, die der Engine sagt, wo sie die Konstanten für die Uniform Buffer sammeln und wo sie diese in der Konstantengruppe platzieren muss. Bei der Ausführung behalten wir die Uniform Buffer im Speicher, der von der CPU angesteuert wird, benutzen die Zuordnungstabelle, um sie in einen vorläufigen Buffer zu kopieren und laden alle Konstanten mit einem einzigen glUniform4fv-Befehl hoch.

Obwohl uns halbwegs schleierhaft ist, weshalb, hat uns der emulierte Codepfad des Uniform Buffers eine Menge Zeit beim Treiber eingespart. Es ist möglich, dass der Treiber ähnliche Vorgänge intern ausführt und dass unsere Implementierung für unsere Rechenlasten schneller funktioniert. Es ist auch möglich, dass der Treiber einfach weniger Zeit mit der Buchhaltung für die Gültigkeitsdauer dieser Buffer aufwendet, da wir weniger Ressourcen schaffen und binden. Egal, woran es nun liegt, dieser Pfad hat die Treiberkosten in einigen Fällen um 10 – 15 % reduziert.
 

Vulkan

Vulkan ist die neueste Grafik-API für Android und auf Leistung und Low-Level-Zugriff auf die Hardware ausgelegt. 2016 haben wir uns mit Samsung zusammengetan, um die ProtoStar-Demo zu erstellen, die zeigen sollte, was mit einer Hochleistungsgrafik-API auf Android möglich ist. Da Fortnite uns dazu zwingt, viele Objekte pro Frame zu zeichnen, schien Vulkan das Mittel der Wahl zu sein. Leider war es nicht ganz so eindeutig.

Die Unterstützung für Vulkan ist noch keine feste Anforderung unter Android, also können wir noch nicht bei allen Android-Geräten darauf zählen. Da wir uns nur der neuesten Hardware zuwenden, war das zunächst für uns kein Hinderungsgrund. Doch wir trafen auf einige Bugs und Performanceprobleme mit früheren Vulkantreibern. Das Ergebnis war, dass auf den meisten Geräten OpenGL schneller und stabiler läuft als Vulkan. Das überrascht nicht weiter: Die Industrie hatte ein Jahrzehnt Zeit, ihre Implementierungen von OpenGL zu optimieren und zu zementieren. Vulkan ist eine komplexere API, und es wird noch einige Zeit dauern, bis es gleichermaßen ausgereift ist.

Wir haben Unterstützung für Vulkan auf dem Samsung S9+ (Adreno) und Note 9 (Adreno) bereitgestellt. In enger Zusammenarbeit mit den Technikern von Samsung konnten wir die Unterstützung der UE4 so optimieren, dass Vulkan schneller war als OpenGL – durchschnittlich etwa um 20 %. Künftig werden wir weiterhin mit unseren Hardware-Partnern zusammenarbeiten, um Hochleistungsunterstützung für Vulkan auf anderen Geräten zu ermöglichen. Das wird Fortnite-Spielern ein besseres Spielerlebnis verschaffen und die Leistung der Vulkantreiber für alle Entwickler verbessern.
 

Arbeitsspeicher

Speicher ist ein andauernder Kampf. Wir liefern nicht nur ein vollständiges Konsolenspiel auf einem mobilen Endgerät, sondern wir fügen dem Spiel fortwährend neue Inhalte hinzu. Deshalb nehmen wir ständig Speicheroptimierungen vor. Android bietet im Vergleich zu anderen Plattformen einige einzigartige Herausforderungen.

Es gibt kein einzelnes Speicherbudget, das wir ins Visier nehmen können. Jedes Gerät hat unterschiedliche Speichergrößen, verschiedene Anwendungen, die im Hintergrund laufen, und möglicherweise unterschiedliche Prinzipien, um zu entscheiden, wann eine Anwendung rausgeworfen wird, weil sie zu viel Speicher verbraucht. Es gibt keine API, die abfragt, wie dieses Speicherbudget aussieht. Um einen Anhaltspunkt zu geben: Wir sind während eines Speichertests einem Spiel beigetreten und haben angefangen, immer mehr Speicher zuzuweisen, bis das Betriebssystem den Prozess unterbunden hat. Bei der Verwendung von neugestarteten Phones, bei denen keine anderen Anwendungen gestartet wurden, konnten wir auf einem Samsung Galaxy S8 (Mali) 3 GB seiner vorhandenen 4 GB Gesamtspeicher zuweisen, bevor es abbrach. Auf einem Google Pixel 2 konnten wir nur 1,8 GB seines Gesamtspeichers von 3,6 GB zuweisen.

Das System, insbesondere der Grafiktreiber, weist für uns viel Speicherplatz zu. UE4 verfolgt die Speicherleistung, die wir vom Betriebssystem anfordern, direkt, was eine Schätzung der Zuweisungen von GPU-Speicher einschließt. Doch wir können immer noch nicht viel davon erkennen, was der Speicher zuweist. Durch Experimente haben wir entdeckt, dass ein großer Teil des Speichers, den der Treiber in Fortnite zugewiesen hat, auf Shader zurückzuführen war.

Die Optimierung durch emulierte Uniform Buffer, von denen vorhin die Rede war, wurde aus Speichergründen durchgeführt. OpenGL erfordert, dass die Anwendung jedes einzelne Mitglied eines Uniform Buffers abfragen kann. Man kann beispielsweise in OpenGL den Versatz für die LocalToWorld-Matrix im Primitiven Uniform Buffer abfragen. Der Treiber muss dafür einige Metadaten, wie z. B. eine Offset-Tabelle, im Speicher behalten, in der sich die Zeichenfolgen für die Namen aller Mitglieder befinden. Und das muss er für jedes Programm tun.

In Fortnite gibt es eine große Vielfalt an Shadern. Während eines normalen Spiels verwendet die Engine ungefähr 2.000 verschiedene Shader-Programme. In jedem dieser Shader-Programme speichert der Treiber scheinbar diese Metadaten, was zu einer großen Speichermenge führt. Wir haben durch die Verwendung von emulierten Uniform Buffern mehr als 400 MB Speicher in Fortnite gespart!

Als wir Fortnite das erste Mal für Android bereitstellten, zeigten unsere internen Tests, dass wir innerhalb der Speicherbeschränkungen unserer Zielgeräte lagen. Wir haben Tests durchgeführt, bei denen wir die Navigation von Google Maps aufriefen, Musik streamten und sicherstellten, dass wir Fortnite problemlos spielen können. Doch nach der Veröffentlichung stellte sich heraus, dass es bei vielen Spielern Abstürze oder schlechte Performance wegen Speichermangels gab.

Wenn einem Android-Phone der Speicher ausgeht, wird es versuchen, Ressourcen freizugeben, indem es nichtgenutzte Anwendungen schließt. Wie sich allerdings herausstellte, gibt es einige ungezogene Hintergrundanwendungen und -dienste, die einfach einen Neustart durchführen, wenn das Betriebssystem sie schließt. Das macht die ganze Lage nur noch schlimmer! Android schließt die Anwendung, um Speicher zurückzugewinnen, doch sie startet neu und beginnt, genauso viel Speicher wie vorher zu verbrauchen. Was noch schlimmer ist - das Anhalten und Neustarten der Anwendungen verbraucht CPU-Zeit. Also haben wir nicht nur keinen Speicher freigegeben, sondern wir vergeuden unnötigerweise CPU-Ressourcen.

Wir haben dann unsere Testverfahren angepasst und mehr der gängigsten und unter Nutzern weit verbreiteten Anwendungen installiert und genutzt, damit wir diese Probleme früher aufspüren konnten. Doch wir mussten immer noch die Speichernutzung reduzieren und das schnell. Wir konnten das Problem eingrenzen auf Nutzer, die mit den Einstellungen Hoch oder Episch auf den neuesten Qualcomm Snapdragon Geräten mit 4 GB Speicher spielten. Und wieder schien Shader-Speicher den Hauptunterschied auszumachen. Als Zwischenlösung half es, Schatten zu deaktivieren, um das Problem zu umgehen. Dadurch wurde die Anzahl der benötigten Shader reduziert, da wir diese Varianten nicht länger brauchten, um Shadowmaps nachzusehen und zu filtern. Außerdem fügten wir ein LRU-Cache für Shader hinzu. Durch das Cache müssen wir nur noch die Shader-Programme im Speicher behalten, die für das Rendern der aktuellen Szene erforderlich sind. Andere Shader-Programme werden komprimiert gespeichert. Wenn nötig, werden sie entpackt und wieder an den Treiber abgegeben.
 

Ausblick - Die nächsten Schritte.

Im Moment konzentrieren wir uns darauf, dass das Spiel auf allen bisher unterstützten Geräten problemlos läuft und dass genug Speicher freigesetzt wird, um die visuelle Qualität und die Stabilität zu verbessern. Dann werden wir uns Kompatibilitätsproblemen wie z. B. dem Sound zuwenden. In der Version V.5.40 werden wir Soundprobleme auf vielen Geräten behoben und uns der Unterstützung für weitere Geräte geöffnet haben. Wir haben außerdem vor, den Nutzern weitreichendere Möglichkeiten bei den Feineinstellungen auf ihren Geräten zu geben und Kompromisse zwischen Qualität und Performance einzugehen.

Wir werden weiterhin an der Unterstützung für Vulkan arbeiten und es im Laufe der Zeit weiteren Geräten zugänglich machen. Das bedeutet, weiterhin eng mit Geräteherstellern an Optimierungen für UE4 und ihren Treibern zu arbeiten. Langfristig wird uns die Investition in die Verbesserung der Unterstützung für Vulkan dabei helfen, für die Spieler und alle UE4 Spiele, die auf Android veröffentlicht werden, eine bessere Performance bereitzustellen.

Wir werden auch weiterhin ältere und langsamere Phones im Auge behalten, aber es ist schlicht nicht machbar, zu weit zurückzugehen. Jedes Jahr werden die High-End-Geräte 50 % schneller, als sie es noch im Vorjahr waren. Fortnite läuft akzeptabel auf zwei Jahre alten Phones, gut auf einem einjährigen Phone und großartig auf Phones, die dieses Jahr herausgekommen sind. Wenn das so weitergeht, stellt euch vor, wie Fortnite erst auf Phones aussehen wird, die nächstes Jahr herauskommen!

image2.png


Viele der Code-Optimierungen, die wir an der Engine vorgenommen haben, gehören bereits zum Lieferumfang von UE4 4.20. Die noch verbleibenden Verbesserungen werden zum Lieferumfang der bevorstehenden Version 4.21 gehören, und wir werden auch weiterhin alle zukünftigen Optimierungen mit allen UE4 Entwicklern teilen.
 

DER KAMPF GEGEN MALWARE 

Noch vor unserer Ankündigung, dass Fortnite für Android veröffentlicht werden wird, wurden wir auf das Auftauchen unbefugter „Fortnite für Android“-Webseiten aufmerksam. Diese enthalten üblicherweise Malware oder Betrügereien.  Wenn wir auf diese Seiten aufmerksam werden, bemühen wir uns, den Seitenbetreiber und die Hosting-Anbieter zur Schließung zu bewegen und jegliche Werbung oder Werbevideos aus dem Netz zu entfernen.  Ob diese Webseiten Malware verbreiten oder nicht, spielt keine Rolle, denn wir betrachten alle Verbreitungen oder angeblichen Verbreitungen von Fortnite für Android als unbefugt. Die einzige rechtmäßige Quelle für Fortnite auf Android stammt von Epic und ist der offizielle Fortnite Installer.
 
Bisher geht Epic in 47 Fällen gegen unbefugte „Fortnite für Android“-Webseiten vor, von denen offenbar viele von denselben Übeltätern betrieben werden. Wir werden weiterhin unnachgiebig das Ziel verfolgen, diese Seiten vom Netz zu nehmen oder den Zugang zu beschränken, indem wir uns Epics Verbindung zu einem Netzwerk von Betrugsbekämpfern zunutze machen (einschließlich ISP, Browserherstellern und Anti-Virus Gesellschaften), die eine Alarmfunktion im Browser implementieren können, der in etwa so aussieht: 

Image1.png
 
Außerdem suchen wir mit einem internationalen Team, das sich nur dieser Aufgabe widmet, vorbeugend nach neuen Malwareseiten. Zusätzlich haben wir einen außenstehenden Internetprovider und eine Agentur zur Betrugsbekämpfung verpflichtet, um unsere Bemühungen diesbezüglich zu unterstützen. Diese Partnerschaft erlaubt es uns, neue Domänen aufzuspüren und zu überwachen, die mit verdächtigen URLs registriert wurden. Sollten diese sich zu schädlichen Webseiten entwickeln, kann Epic angemessene Schritte bis hin zu einem Gerichtsverfahren einleiten.

ZUSAMMENFASSUNG

Fortnite für Android präsentiert viele Branchenneuheiten – es ist das erste Konsolen- und PC-Spiel mit plattformübergreifender Kompatibilität und Spielbarkeit und es ist das erste Blockbuster-Spiel, das außerhalb des Google Play Stores vertrieben wird. Es war ein gewaltiges Unterfangen und ein enormer Lernprozess, doch die schnelle Akzeptanz bei mehr als 15 Millionen Adroid-Nutzern zeigt, dass diese Herangehensweise fundiert ist und äußerst erfolgreich sein kann. Und das Wichtigste ist, dass die gesamte technische Arbeit, die wir für Fortnite geleistet haben, allen Unreal Engine-Entwicklern in der Version 4.21 zugänglich gemacht wird, damit jeder von dieser Arbeit profitieren kann.