One of the biggest game releases of the summer was Fortnite. The game, which has been available on other platforms for what seems like eons, finally made it to Android with the launch of Epic’s beta program on August 9.
At first, the game was only available for Samsung devices, but it didn’t take long for Epic to start issuing invitations to owners of a very specific subset of Android devices. Even with limited device support, Epic saw 15 million players install the game within the first 21 days of its launch!
But why the slow rollout? Why are only certain devices supported? Why not just make it available to everyone? The official answer is that Fortnite is a highly demanding game and only devices released within the last two years are capable of playing it smoothly. However, that isn’t the full story.
Epic has published a blog post detailing its battle against Android fragmentation and how it has overcome the huge differences in hardware and software implementations to widen its support to include all of Samsung’s flagship devices since the Samsung Galaxy S7; all of Google’s Pixel smartphones; several devices from Huawei, including the Honor 10, the Mate 10 and the P20; the LG G5 and upwards, as well as the LG V20 and newer; the Nokia 8; the OnePlus 5, 5T and 6; and some popular devices from Xiaomi, Asus and ZTE.
Epic saw 15 million players install the game within the first 21 days of its launch!
Fortnite uses the Unreal Engine, a 3D game development ecosystem which includes wide support across multiple platforms. In this sense, getting Fortnite to work on Android wasn’t a case of needing to rewrite the game for Android, but rather about optimization for rendering performance, stability, and memory usage.
The beauty of the Android ecosystem is in its diversity. Consumers have a huge range of devices to choose from all with different price points. But this diversity can be a nightmare for game developers.
For example, there are lots of different processors found at the heart of these devices. Many use Snapdragon processors from Qualcomm, which have Adreno GPUs. But other devices use processors from Samsung (Exynos), MediaTek (MTxxxx), or Huawei (Kirin). These latter processors use the Mali GPU from ARM.
Some GPU’s support OpenGL 3.x only, while others support OpenGL 3.x and Vulkan. Also, most manufacturers customize the scheduler and power management features of their devices. Epic also found that devices with the same GPU can have different graphics driver versions. What this means is that two devices that share the same underlying hardware can have very different performance characteristics.
Just because two devices have the same hardware doesn't mean they are calibrated the same.
To get the best results on Samsung’s devices, Epic worked closely with Samsung’s engineers and even contributed code changes to the Vulkan renderer. Google also played a role, and its engineers helped Epic identify key areas for optimizations. Together they also worked out a solid frame pacing implementation for OpenGL on Android. Also involved were ARM, Qualcomm, and many others.
The slow adoption of the latest versions of Android is often cited as being a big factor in Android fragmentation. However, Epic found that a whopping 92 percent of Fortnite users are running Android 8.0 Oreo or newer.
Epic found that 92% of Fortnite users are running Android 8.0 Oreo or newer.
The bigger problem is the tweaks that OEMs make to the internals of Android. For example, there is no single memory budget that Epic can target. Each device has a different amount of memory and different settings about when to kill apps if memory gets tight. Epic tested memory allocation on a Samsung Galaxy S8 (with a Mali GPU) and found it could allocate 3GB of its 4GB total memory before being terminated. But, on a Google Pixel 2, it could only allocate 1.8GB of its 3.6GB total memory.
In other words, both devices have around 4GB of RAM, but 1.2GB less of it was usable on the Pixel 2!
To support a wide range of devices with different memory and performance characteristics, Epic uses the “classic” approach found on many PC games, that of performance levels: Low, Mid, High, and Epic. These levels adjust settings in the game to boost performance while reducing quality.
For example, Low pulls in the view distances and disables all optional graphics features. But the Epic level has everything turned on including shadows and foliage, plus it uses the farthest view distance.
On top of this, there are a set of GPU profiles, e.g. Adreno 54x, Adreno 630, and Mali G72. These GPU profiles choose a performance profile that best fits the hardware’s capabilities as well as activating any workarounds needed for that specific hardware.
Finally, there are device-specific profiles for different devices, e.g. Samsung Galaxy Note 9 Adreno and Google Pixel 2 XL. These allow the game engine to enable further workarounds or optimizations when needed.
Many of the code optimizations Epic made have already shipped with UE4 4.20. The upcoming 4.21 release will feature even more of them.
Epic wants to use Vulkan (rather than OpenGL ES) on more devices and it is continuing to improve the Vulkan support by working with device manufacturers on the optimizations. Long-term, improving Vulkan support will help Fortnite to offer better performance for players, but it will also benefit all Unreal Engine 4 based games released on Android.