Fortnite

Retour technique sur le lancement de Fortnite pour Android

06.09.2018
By L'équipe Fortnite

INTRODUCTION

Le 9 août, nous avons lancé la bêta de Fortnite sur Android sur un certain nombre d'appareils de notre partenaire Samsung. Quelques jours plus tard, nous avons invité des utilisateurs de téléphones Android fabriqués par d'autres marques. Cette bêta nous a beaucoup appris en ce qui concerne les performances, la sécurité, la compatibilité entre appareils et la manière de proposer Fortnite sur Android via un programme d'installation. Aujourd'hui, regardons d'un peu plus près les détails techniques de ce lancement, ce sur quoi nous travaillons actuellement et ce que nous envisageons à l'avenir avec Android.

STATISTIQUES

Au cours des 21 premiers jours, l'intérêt pour Fortnite sur Android ne s'est pas démenti, avec plus de 23 millions de joueurs qui ont demandé à participer à notre bêta Android, et avec plus de 15 millions de joueurs qui ont installé notre APK. Bien que la participation à la bêta Android se fasse pour le moment sur invitation uniquement, le taux de joueurs invités qui jouent effectivement est similaire à celui de la bêta pour iOS.

MATÉRIEL, OPTIMISATION


Introduction technique

Proposer le même jeu sur toutes les plateformes, tout en permettant les parties multiplateforme, est un défi unique. Généralement, quand on essaie de migrer un jeu console ou PC sur un appareil mobile, on simplifie le contenu et même l'apparence pour répondre aux contraintes de la plateforme et garantir des performances acceptables. À titre d'exemple, vous allez limiter le nombre d'objets affichés à l'écran pour réduire la charge. Mais dans Fortnite, les joueurs sur Android peuvent se retrouver à jouer dans la même partie que leurs amis sur PC et console. Il faut donc que le jeu affiche tout ce qui affecte le gameplay.

Réussir à passer sous Android

Depuis janvier 2018, une équipe étendue travaille d'arrache-pied sur la version Android de FNBR. Le plus gros de nos efforts a concerné les performances de rendu, la stabilité et la mémoire, mais le nombre et la variété des appareils Android, des versions du système d'exploitation et des versions des pilotes ont été les principaux obstacles à surmonter.

Travailler avec des partenaires s'est avéré essentiel pour porter Fortnite sur Android. Sans leurs connaissances et leur travail acharné, rien n'aurait été possible.

Nous avons travaillé en étroite collaboration avec Samsung pour optimiser Fortnite sur leurs divers appareils. Samsung a envoyé des ingénieurs dans plusieurs bureaux d'Epic tout autour du monde. Ils ont travaillé directement avec nos propres ingénieurs sur les optimisations et les analyses des performances et ont contribué à de nombreux changements de code, notamment pour le rendu avec Vulkan. En utilisant des téléphones de test et leurs propres outils d'ingénierie, ils ont pu nous informer des goulets d'étranglement en matière de performances et de mémoire, et nous ont aidés à les régler. Nous avons également travaillé avec Samsung pour créer le processus d'installation le plus fluide et le plus sûr possible pour les utilisateurs de téléphones Samsung.

Les ingénieurs de Google sont également intervenus pour nous aider à optimiser Fortnite, à identifier les optimisations clés et une fuite de mémoire, et à planifier l'intégration de la version OpenGL du jeu pour Android. Les ingénieurs Android de chez Google sont talentueux, passionnés par les optimisations et l'amélioration constante de l'écosystème Android au profit du jeu.

De plus, nous avons pu travailler avec de nombreux autres partenaires pour tester et optimiser Fortnite, notamment ARM, Qualcomm, Imagination Technologies, Razer, HiSilicon et bien d'autres encore.

Fragmentation

L'écosystème Android comprend des téléphones conçus par différents fabricants. Chaque téléphone est architecturé autour d'un System-on-Chip (SOC) qui comprend une configuration de noyaux de processeurs et de cartes graphiques. Il y a plusieurs familles de SOC, notamment le Snapdragon de Qualcomm (71% des appareils actuels) et son processeur Adreno, ou l'Exynos de Samsung, la série MT de MediaTek et la série Kirin de HiSilicon, qui utilisent tous des processeurs ARM Mali. Chaque appareil dispose d'une version légèrement différente du système d'exploitation d'Android et la plupart des fabricants personnalisent certaines fonctions (comme la gestion de l'énergie). Les appareils qui ont le même processeur peuvent également avoir des versions différentes des pilotes graphiques. Au final, deux appareils qui partagent la même configuration matérielle peuvent offrir des performances différentes et rencontrer des bugs différents.

Nous avons eu l'heureuse surprise de constater que l'adoption de la dernière version d'Android est beaucoup plus importante que nous ne l'avions anticipée pour les appareils ayant jusqu'à 2 ans. Dans notre bêta, actuellement, avec des appareils aux caractéristiques supérieures, nous constatons que 92% des utilisateurs de Fortnite utilisent Android 8 (Oreo) ou plus récent, qu'environ 8% utilisent Android 7 (Nougat) et que moins de 0,5% utilisent une version d'Android datant de 2015 ou antérieure. Pour les appareils qui ont plus de 2 ans, la chute en performances est significative. Pour ces appareils, les fabricants doivent proposer des mises à jour personnalisées et, dans la plupart des cas, se coordonner avec les différents opérateurs mobiles du monde entier pour développer et publier leurs mises à jour.

Pour gérer cette complexité, nous utilisons le système de profilage hiérarchique des appareils d'Unreal Engine. Nous commençons par créer quatre profils de performances : Faible, Moyen, Élevé et Épique. Ces profils ajustent les paramètres d'échelle dans le moteur pour permettre au jeu de fonctionner avec différentes caractéristiques de performances. En paramétrage Faible, la distance d'affichage est réduite au maximum et les fonctions graphiques optionnelles sont désactivées. En paramétrage Épique, tout est activé : les ombres, les feuillages, la distance d'affichage la plus éloignée possible...

De plus, nous disposons d'un ensemble de profils de carte graphique (par exemple, Adreno 54x et Mali G72). Ceux-ci permettent d'utiliser un profil de performances qui correspond au mieux aux capacités de l'appareil, tout en nous permettant d'activer les optimisations ou les programmations spécifiques que nécessite cet appareil. Enfin, nous avons un ensemble de profils spécifiquement dédiés à un appareil en particulier (par exemple, le Samsung Galaxy Note 9 Adreno et le Google Pixel 2 XL). Cette couche finale de profils nous permet d'activer des optimisations supplémentaires sur ces appareils, lorsque c'est nécessaire. À l'activation, nous analysons des propriétés telles que le modèle de l'appareil, la version du système d'exploitation et la version du pilote graphique, et cela permet de déterminer le profil d'appareil à utiliser.

Performances de rendu

Le coût en ressources processeur du rendu était de loin le problème le plus important pour conserver une fluidité satisfaisante. Le jeu consomme beaucoup de temps processeur avec les pilotes graphiques d'Android, si on compare aux ressources nécessaires sur un PC, sur une console ou un appareil iOS. Les appareils Android les plus récents, tels que la version Adreno du Galaxy S9, peuvent traiter l'affichage de plus de 1500 objets par image, ce qui est très largement supérieur aux appareils plus anciens. Les appareils de milieu de gamme avec lesquels nous sommes compatibles doivent pouvoir traiter environ 600 objets par image, tandis que les appareils les moins performants doivent être à environ 400 objets par image.

Nous avons déjà réduit au minimum le nombre d'objets nécessaires pour le rendu de chaque image quand nous avons développé la version iOS un peu plus tôt cette année, et nous avons donc dû chercher d'autres solutions. Nous avons fait des tests pour constituer des groupes d'affichage d'objets dynamiques par image et, si nous avons constaté des gains, ils n'étaient pas suffisants pour justifier l'ajout d'une telle complexité dans le code.

Nombre d'optimisations dans notre rendu OpenGL ont permis de petites victoires, mais le gain le plus spectaculaire a été obtenu sans que nous nous y attendions alors que nous optimisions l'utilisation de la mémoire, grâce à la mémoire tampon uniforme émulée. C'est une fonctionnalité intégrée dans l'UE4 depuis des années, qui est employée par les appareils OpenGL ES2 qui ne sont pas nativement compatibles avec la mémoire tampon uniforme (ou mémoire tampon constante). Voici comment cela fonctionne. Au moment de la compilation des shaders, nous identifions toutes les constantes requises pour un shader et nous les plaçons dans un dépôt dans lequel le shader puise. Nous stockons également une table de mapping qui dit au moteur où récupérer les constantes de la mémoire tampon uniforme et où les placer dans le dépôt constant. Au moment du lancement du programme, nous conservons la mémoire tampon uniforme dans la mémoire accessible du processeur, nous utilisons la table de mapping pour les copier dans une mémoire tampon temporaire et nous téléchargeons toutes les constantes avec un seul appel de fonction glUniform4fv.

Bien que nous ne comprenions pas vraiment pourquoi, la mémoire tampon uniforme émulée permet d'économiser énormément de temps dans les pilotes. Il est possible que les pilotes fassent quelque chose de similaire en interne et qu'en prémâchant ce travail, la charge soit moins lourde pour les pilotes. Il est également possible que, puisque nous créons et associons moins de ressources, le pilote passe moins de temps à gérer ces tampons. Quoi qu'il en soit, cette fonctionnalité réduit dans certains cas la charge des pilotes de 10 à 15%.

Vulkan

Vulkan est la nouvelle API graphique pour Android. Elle est conçue pour améliorer les performances et autoriser un accès bas niveau au matériel. En 2016, nous nous sommes associés à Samsung pour créer la démo ProtoStar, afin de montrer ce qu'il était possible de faire sur Android avec une API graphique performante. Dans Fortnite, comme nous devons afficher beaucoup d'objets dans chaque image, utiliser Vulkan semblait aller de soi. Mais ça n'a pas été si simple.

La compatibilité avec Vulkan n'est pas encore une obligation sur Android, et nous ne pouvons donc pas espérer qu'il soit disponible sur tous les appareils. Comme nous développons le jeu uniquement pour les appareils les plus récents, cela ne nous a pas empêchés de l'utiliser, mais nous avons rencontré de nombreux bugs et problèmes de performances avec les pilotes Vulkan au démarrage, et au final, OpenGL est plus rapide et plus stable que Vulkan sur la plupart des appareils. Ce n'est pas surprenant : l'industrie a eu plus d'une décennie pour optimiser et utiliser les fonctions OpenGL sur ses appareils. Vulkan est une API plus complexe et il faudra un peu de temps avant d'atteindre ce niveau de maturité.

Nous avons tout de même lancé une version compatible avec Vulkan pour le Samsung S9+ (Adreno) et le Note 9 (Adreno). En travaillant avec les ingénieurs de Samsung, nous avons réussi à optimiser la compatibilité d'UE4 avec Vulkan pour obtenir des performances environ 20% supérieures à OpenGL. Nous allons continuer à travailler avec nos partenaires constructeurs pour proposer une version Vulkan offrant de meilleures performances sur les autres appareils, ce qui permettra aux joueurs de Fortnite sur Android d'avoir une meilleure expérience du jeu, mais aussi pour améliorer les performances des pilotes Vulkan pour tous les développeurs.

Mémoire

L'utilisation de la mémoire est un problème récurrent, pour ne pas dire permanent. Non seulement nous proposons l'équivalent d'un jeu console sur téléphone portable, mais nous ajoutons en permanence du nouveau contenu dans le jeu. Nous sommes donc constamment en train de chercher des moyens d'optimiser l'utilisation de la mémoire. La plateforme Android présente quelques défis uniques si on la compare aux autres.

Pour commencer, nous ne pouvons pas travailler en prenant en compte une quantité fixe de mémoire. Chaque appareil propose une quantité de mémoire différente, il peut y avoir différentes applications qui tournent en tâche de fond et chaque fabricant peut décider différemment comment gérer la mémoire pour les applications gourmandes. Il n'y a pas non plus d'API pour contrôler la quantité de mémoire disponible. Pour vous donner une idée, nous avons, lors d'un test de mémoire, rejoint une partie et alloué autant de mémoire que possible jusqu'à ce que le système d'exploitation arrête le processus. En utilisant des téléphones qui venaient d'être rallumés, sans lancer d'autres applications, nous sommes parvenus à utiliser jusqu'à 3 Go de mémoire sur les 4 Go disponibles d'un Samsung Galaxy S8 (Mali). Sur un Google Pixel 2, nous n'avions pu allouer que 1,8 Go sur les 3,6 Go de mémoire totale.

Le système, notamment les pilotes graphiques, nous alloue beaucoup de mémoire. UE4 garde la trace de toute la mémoire que nous demandons directement à l'OS, y compris une estimation des allocations de mémoire pour le processeur graphique, mais nous ne savons pas vraiment ce que les pilotes allouent. À travers nos tests, nous avons découvert qu'une grande partie de la mémoire allouée à Fortnite par les pilotes est liée aux shaders.

Quand nous avons optimisé la mémoire tampon uniforme émulée, dont nous avons déjà parlé, c'était pour des raisons de mémoire. Utiliser l'OpenGL implique que l'application puisse demander l'emplacement de n'importe quelle unité d'un tampon uniforme. Par exemple, on peut demander à OpenGL le décalage de la matrice LocalToWorld dans le tampon uniforme Primitive. Pour y parvenir, les pilotes doivent conserver des données méta en mémoire, par exemple une table de décalage, qui intègrent des données associées au nom de chaque unité, et ce pour tous les programmes.

Dans Fortnite, nous avons un grand nombre de shaders. Lors d'une partie classique, le moteur va utiliser environ 2000 programmes de shader différents. Et dans chacun des programmes de shader, les pilotes sembler stocker ces données méta, ce qui consomme beaucoup de mémoire. En utilisant des tampons de mémoire uniforme émulée, nous avons réussi à économiser plus de 400 Mo de mémoire dans Fortnite !

Lorsque nous avons commencé à proposer Fortnite sur Android, nos tests en interne indiquaient que nous répondions aux contraintes de mémoire des appareils que nous voulions pouvoir utiliser. Lors de nos tests, nous lancions une recherche de navigation dans Google Maps et nous écoutions de la musique en streaming tout en jouant à Fortnite sans rencontrer de problèmes. Mais quand nous avons lancé Fortnite, beaucoup de joueurs se sont plaints d'avoir des plantages ou des problèmes de performances parce qu'ils manquaient de mémoire.

Quand un téléphone Android commence à manquer de mémoire, il essaie de libérer des ressources en fermant les applications qui ne sont pas utilisées. Il se trouve toutefois qu'un grand nombre d'applications en tâche de fond ou de services se contentent de redémarrer quand le système les ferme. Et cela empire la situation ! Android fermait l'application pour récupérer de la mémoire, mais elle se relançait et consommait autant de mémoire qu'avant. Pire : arrêter et lancer des applications consomme du temps processeur, et donc non seulement cela ne libérait pas de mémoire, mais cela consommait inutilement des ressources du processeur.

Nous avons mis à jour nos processus de test pour installer et lancer certaines applications souvent utilisées par les utilisateurs, afin de repérer à l'avance ces problèmes, mais il fallait quand même réduire l'utilisation de la mémoire, et ce, rapidement. Nous avons remarqué que les problèmes se posaient principalement quand les joueurs utilisaient les réglages Élevé ou Épique sur des appareils récents dotés d'un processeur Qualcomm Snapdragon et de 4 Go de mémoire. Là encore, la mémoire utilisée pour les shaders semblait poser problème. En mesure d'urgence, désactiver les ombres permettait de limiter le problème. Cela réduit le nombre de shaders nécessaires, puisque les variantes n'ont plus à chercher et à filtrer les shadowmaps. Nous avons aussi ajouté un cache LRU pour les shaders. Ce cache permet de ne garder en mémoire que les programmes de shader nécessaires pour faire le rendu de la scène actuelle. Les autres programmes de shader sont pour leur part stockés en version compressée dans la mémoire. En fonction des besoins, ils sont décompressés et transférés aux pilotes.

L'avenir - Prochaines étapes

Pour l'instant, nous concentrons nos efforts sur l'amélioration des performances du jeu sur tous les appareils compatibles et sur l'optimisation de l'utilisation de la mémoire dans le but d'améliorer la qualité graphique et la stabilité. Nous travaillerons ensuite à régler les problèmes de compatibilité, à l'image du son : dans la version 5.40, nous avons par exemple corrigé des problèmes de son sur plusieurs appareils, en plus de permettre d'utiliser le jeu sur un plus grand nombre d'entre eux. Nous voulons aussi offrir aux utilisateurs plus d'options de paramétrage sur leurs appareils, en choisissant par exemple de mettre l'accent sur la qualité ou sur les performances.

Nous continuerons à travailler sur la compatibilité avec Vulkan et à permettre de l'utiliser sur de plus en plus d'appareils au fil du temps. Nous allons travailler avec les fabricants sur des optimisations, autant dans l'UE4 que du côté de leurs pilotes. À long terme, ces efforts pour améliorer la compatibilité avec Vulkan et les pilotes nous permettront d'offrir de meilleures performances à tous les joueurs et à tous les jeux développés avec l'UE4 qui seront disponibles sur Android.

Nous cherchons encore à voir s'il est possible d'utiliser des téléphones plus anciens et plus lents, mais nous ne pouvons pas remonter trop loin en arrière. Chaque année, les nouveaux téléphones haut de gamme sont environ 50% plus rapides que la génération précédente. Fortnite fonctionne de façon acceptable sur des téléphones datant d'il y a deux ans, de façon très correcte sur les téléphones datant d'il y a un an et parfaitement sur les téléphones récents. À ce rythme, imaginez ce à quoi Fortnite pourra ressembler sur les téléphones qui sortiront l'an prochain !

image2.png


Enfin, bon nombre des optimisations du code que nous avons apportées à l'Unreal Engine ont déjà été ajoutées dans la version 4.20 du moteur. Les autres optimisations seront ajoutées dans la prochaine version, la 4.21, et nous continuerons à partager nos futures optimisations avec tous les développeurs utilisant l'UE4.

LA GUERRE CONTRE LES MALWARES

Avant même que nous annoncions que Fortnite serait disponible sur Android, nous avons vu apparaître des sites Internet « Fortnite pour Android » non-autorisés. Ce genre de sites abrite souvent des malwares (logiciels malveillants) ou tentent d'escroquer les joueurs. Lorsque nous en nous repérons, nous mettons en œuvre différents moyens pour fermer les sites et leurs hébergeurs, et empêcher que soient diffusées des publicités ou des vidéos qui en font la promotion. Que les sites Internet abritent ou non des malwares, nous considérons que toute distribution ou soi-disant distribution de Fortnite pour Android n'est pas autorisée. La seule source légitime pour obtenir Fortnite pour Android est de passer directement par Epic via notre programme d'installation officiel de Fortnite.

À ce jour, Epic s'est attaqué à 47 sites « Fortnite pour Android » non autorisés, dont un certain nombre sont gérés par les mêmes personnes douteuses. Nous continuons à surveiller la situation et cherchons à les faire fermer ou à limiter leur accès en faisant appel à notre réseau de partenaires de lutte contre la fraude (notamment les FAI, les développeurs de navigateurs Internet ou d'antivirus), afin qu'un message d'alerte soit affiché dans les navigateurs, à la manière de ceci :

Image1.png

Une équipe interne dédiée recherche activement tous les nouveaux sites de malwares au fur et à mesure qu'ils apparaissent. Nous faisons également appel à une société externe spécialisée dans la lutte contre la fraude et l'utilisation d'IP frauduleuses pour consolider nos efforts. Ce partenariat nous permet de repérer et de surveiller les nouveaux domaines créés avec des URL suspectes. S'ils deviennent des sites à risque, Epic prendra toutes les mesures nécessaires pour les empêcher de nuire, y compris en les attaquant en justice.

CONCLUSION

Fortnite pour Android innove de plusieurs façons : c'est le premier jeu PC et console disponible également sur Android qui offre une compatibilité complète en termes de jeu multiplateforme, et c'est aussi le premier jeu très populaire proposé hors de la boutique Google Play. C'est une entreprise immense et il nous a fallu apprendre beaucoup de choses, mais son adoption très rapide par plus de 15 millions d'utilisateurs sur Android nous prouve que cette approche était la bonne, et qu'elle peut rencontrer le succès. Et le plus important, c'est peut-être aussi que tout le travail que nous avons fait sur Fortnite pour Android sera également utilisable par tous les développeurs utilisant l'Unreal Engine dès la version 4.21, afin que tout le monde puisse en profiter.