State of Roblox graphics API across all platforms, with percentage deltas since EOY 2018. Updated December 29 2019.
|Direct3D 11+||85% (+5%)|
|Direct3D 10.1||8.5% (-1.5%)|
|Direct3D 10.0||5.5% (-2.5%)|
|Direct3D 9||1% (-1%)|
We no longer support Windows XP and Vista, which is where most of the drop in Direct3D 9 is coming from. For users who are still on Direct3D 9 (because their hardware doesn't support FL10), we can further break this down by GPU (SWVP or HWVP):
More than two thirds of all Direct3D 9 users use SWVP with vertex shaders running during DrawIndexedPrimitive on CPU.
|Direct3D 11+||94% (+2%)|
|Direct3D 10.1||4% (-1%)|
|Direct3D 10.0||2% (-1%)|
Note that we don't support Direct3D feature level 9 on Windows store, which is why we don't see any D3D9 usage there.
|OpenGL 4.1||14% (-5%)|
|OpenGL 3.3||8% (-4%)|
|OpenGL 2.1||1% (-2%)|
Approximately half of OpenGL 4.1 users are using OSX 10.10 or earlier; this suggests that they could get Metal support if they upgraded the OS. Assuming this is true, ~17% of our Mac users are stuck with OpenGL until they buy new hardware.
|OpenGL ES 2.0||2% (-3%)|
We are no longer using ES 3.0 on iOS (we previously used it on iOS 8, but we've switched to ES 2.0 for these devices instead to simplify maintenance).
|Vulkan 1.1||13% (+13%)|
|Vulkan 1.0||32% (+5%)|
|OpenGL ES 3.2||11% (+5%)|
|OpenGL ES 3.1||18% (-3%)|
|OpenGL ES 3.0||17% (-11%)|
|OpenGL ES 2.0||9% (-9%)|
Note that compared to last year, we disabled Vulkan support on Android 7.0. We have ran into many driver issues with 7.0; while we were able to find workarounds for many of them, we were not able to solve some issues with SPIRV compilation and completely broken tile flushes on several Adreno models; additionally new issues on 7.0 kept being discovered. To stop this being an ongoing maintenance burden we have switched to GL on devices with 7.0; we run Vulkan on devices that support it from 7.1 now.
Despite this, this year saw a tremendous shift towards Vulkan - almost half of our userbase uses our Vulkan renderer now.
What does the future hold?
Looking at this data and at the trends, we are steadily climbing out of the pit of despair, aka GLES2 as a min spec. We will probably need to support these devices for a few more years, but they are steadily losing their importance.
Direct3D9 on PC took a large hit this year, mostly due to us stopping Windows XP support - PC market is pretty stagnant otherwise. It is likely that we will stop supporting Direct3D 9 completely next year, which will be great because that's one of the more challenging APIs to support due to arbitrary shader instruction length limitations, and it is also responsible for a large fraction of our total crashes due to issues in legacy software vertex processing driver code.
macOS Metal is slowly becoming more prevalent but unfortunately it doesn't do this as quickly as I'd like. OpenGL 2 is basically dead on macOS and we will likely stop supporting it next year, but OpenGL 3/4 is going strong and it's not clear when these numbers will move more substantially. While we don't need to build new features for OpenGL anymore, we do need to maintain the codepath and make sure it's reasonably performant.
OpenGL ES2 on iOS is almost defunct, at 2% it's not small enough for us to stop supporting it but it's getting close. These devices correspond to iPad 2/3/4 and iPhone 4S/5. We will likely wait until Apple stops support for them completely but this will mark the first time for us to change our min. spec on Apple mobile platform since we shipped support for it in 2012 and I'm excited for this.
OpenGL ES2 on Android will have to live a bit longer, but it finally started to go away. I suspect this is both because users keep upgrading phone hardware and because our developers keep building more interesting games that don't run fast enough on phones that are 7+ years old, so the entire market slowly moves to more reasonable baseline. ES2 and ES in general will remain a maintenance burden for quite a while longer but it's refreshing to see the data change.
Several of our engineers, me included, spent lots of time working with Vulkan. I'm very happy now that we've perservered and launched Vulkan support - this year we've seen tremendous growth there, and now almost half of our userbase uses Vulkan renderer. This puts a lot of responsibility on us but, even more importantly, on graphics driver vendors to keep Vulkan fast and correct, but this helps the entire ecosystem long term (as well as our users today).
I expect that it's going to be more interesting for us to look into more Metal and Vulkan features in the future. We still use Metal 1.0 with very few newer features, so there's some opportunity here to improve performance / develop more ambitious features on iOS. One area we haven't explored as much in Vulkan is compute, and I worry that we'll hit a new class of issues in the ecosystem when we do - but it's inevitable that we need to move that way to develop better graphics features going forward.