Skip to content

Instantly share code, notes, and snippets.

What would you like to do?

State of Roblox graphics API across all platforms, with percentage deltas since EOY 2019. Updated December 27 2020.


API Share
Direct3D 11+ 89% (+4%)
Direct3D 10.1 7% (-2%)
Direct3D 10.0 3.5% (-1.5%)
Direct3D 9 0.5% (-0.5%)

We no longer support Windows XP and Vista; users who are still on Direct3D 9 have hardware that doesn't support FL10, with 70% of them using Intel integrated GPUs without hardware vertex shader support. At this point it is likely that we're going to stop supporting Direct3D 9 next year.

We also use slightly different implementations for FL10 and FL10.1 for some shaders (notably FL10.1 supports MSAA texture sampling), which was very important back in the day to maximize the reach of some graphics features but that distinction is likely not very useful now, so we may consolidate these next year.

Otherwise PC market continues to be stable (... which also means it moves slowly). We haven't investigated the possibility of switching to Direct3D 12 or Vulkan on Windows yet, something that we may look into next year as well.

Windows Store

API Share
Direct3D 11+ 95% (+1%)
Direct3D 10.1 3.5% (-0.5%)
Direct3D 10.0 1.5% (-0.5%)


API Share
Direct3D 11 100%


API Share
Metal 86% (+9%)
OpenGL 4.1 9% (-5%)
OpenGL 3.3 5% (-3%)

As of 2020, we no longer support OpenGL 2 on desktop (which represented ~1% of macOS).

Around 1/4 of our OpenGL users run OSX 10.10 or earlier, which means that some of them might be able to run Metal upon an OS upgrade - but the vast majority won't be, which means that at least 3/4 of OpenGL users on OSX are stuck with OpenGL until they buy a new computer.

Overall Metal drivers are pretty stable but we did have to implement several different workarounds throughout the year and work with Apple to resolve a really serious shader compiler issue with Xcode 12 (that has since been fixed). Overall the maintenance cost continues to remain small but non-zero for Metal on macOS; with the launch of M1 we're planning to do some more work on making sure we optimally work with memory on UMA devices next year.


API Share
Metal 99.5% (+1.5%)
OpenGL ES 2.0 0.5% (-1.5%)

The market share of 32-bit OpenGL devices is continuing to drop; it is likely that we will stop supporting OpenGL on iOS next year.

It's been quite a journey; we've initially launched Roblox on iOS using Ogre's OpenGL ES1 backend (in all its fixed-function glory), followed by an OpenGL ES 2 port, then dropping Ogre in favor of our own rendering engine, porting to ES3, and then switching to Metal and seeing more and more devices adopt Metal. On iOS Metal is superior to OpenGL in every possible way and it would be good to be able to stop worrying about ES2 limitations on at least one platform.


API Share
Vulkan 1.1 47% (+34%)
Vulkan 1.0 23% (-9%)
OpenGL ES 3.2 10% (-1%)
OpenGL ES 3.1 9% (-9%)
OpenGL ES 3.0 8% (-9%)
OpenGL ES 2.0 3% (-6%)

Vulkan adoption continues to grow. The total Vulkan market share grew from 45% to 70% this year; Vulkan 1.1 support per se is not that meaningful since a lot of hardware features in 1.1 upgrade are optional, but these do represent newer (and as such, more stable drivers), and the general trend of migrating away from OpenGL devices is very welcome. Despite this, OpenGL ES 2 is still present on the market, and OpenGL ES 3 - abundant.

Our strategy continues to be one where we invest in Vulkan in terms of maximizing device performance and new features; OpenGL doesn't get new features that require "advanced" hardware functionality, and many other features may be disabled to maximize performance.

Vulkan driver stability is slowly improving, but we continue to have occasional issues around existing basic feature set. Next year we are likely to start deploying compute shaders for some parts of the graphics pipeline which is likely to require a large set of complex workarounds based on what we've seen in early testing, but time will tell.

Given the market size, we'll need to continue supporting all OpenGL ES versions; it's unfortunate that we need to use some ES3 features for memory/performance savings - on iOS we were able to make a clean cut between ES2 (very low quality graphics, no modern features to speak of) and Metal (high performance, decent quality, good feature coverage), whereas on Android the more fragmented market pushes us to keep the distinction between ES2 and ES3 for a bit longer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment