ILS on Quest 2

Today is a very exciting day with the new Oculus Quest 2 coming out, and we’ve got a special surprise to share with you. We’ve done a lot of work to optimize Isle of Lost Skulls, and have set it live for Quest 2 players! With this release, we wanted to take the opportunity to answer a common question we get from users:

Why isn’t some content available on all devices?

The answer is that the content doesn’t meet our bar for performance. We want all of our players to have an excellent experience no matter what platform you choose to play on or where you are in the game. With that goal in mind, exposing certain content to all platforms would be an irresponsible move. Periodically, we evaluate whether we can optimize some pieces of content to bring it to more platforms, and today, we want to show you what that looked like for bringing Isle of Lost Skulls to Quest 2!

First, let’s go over the common ways in which performance is affected.

Draw Calls

Something we have to look out for that has a huge impact on performance is the number of “draw calls” that we’re making. In a nutshell (and we’re massively over-simplifying here), a draw call is a command that Rec Room makes to render (or “draw”) some object or set of objects so that you can see them on your screen. Each draw call takes time to set up and execute, so the more draw calls you have to make in a scene, the more expensive it is to render and, once you’re making enough of them, the worse your performance will be. Our goal for ILS was to reduce the number of draw calls we were making every frame to match our other scenes that perform much better on less powerful platforms. There’s a number of ways to do this, and we’ll discuss some of them here.

Occlusion Culling

One tool we use to reduce the number of  draw calls we’re making is occlusion culling. By default, Unity uses “frustum culling,” which automatically tries to avoid drawing meshes that aren’t in view. That means that we aren’t wasting draw calls rendering a bunch of objects that are behind you,  but it doesn’t do anything about objects that are hidden behind other elements in the scene. If you look straight at a wall, there is a good chance that everything behind the wall is still being drawn, even though you can’t actually see any of it. (There are some exceptions here that we won’t go into now.) These draw calls are wasted resources that could be used for the pretty art our artists make instead! The solution here is occlusion culling, which prevents us from drawing objects which the player can’t see because they are occluded by something else. While we certainly wish this was as simple as just turning it on, that typically results in a bunch of visual artifacts. (If you’ve ever found a spot in an RRO room where you can stand and some objects suddenly disappear, you’re probably seeing one such artifact!) It typically takes some tuning and markup from us to get things looking just right, but the result is less time spent rendering things the player wouldn’t see anyway. Occlusion culling is just a bake we can run on a scene and usually comes with some work to refine the bake, and marking up props to make sure visual issues don’t pop up.

Check out these screenshots of Gibbet Jungle which show exactly what’s being drawn. The player is standing at the axis marker, and is facing towards the blue arrow. You’ll notice that most of the props for the first major encounter of this act (which take place in the direction of the red arrow) are being frustum-culled in both images, since the player is looking in a different direction.

Without occlusion culling (occlusion culling is checked here showing you any occlusion culling if the bake had been present. Currently, this just shows off frustum culling where things outside the camera view are not rendered.)

Without occlusion culling (occlusion culling is checked here showing you any occlusion culling if the bake had been present. Currently, this just shows off frustum culling where things outside the camera view are not rendered.)

With occlusion culling. Notice how objects behind the first row of rocks aren’t drawing because they can’t be seen by the player.

With occlusion culling. Notice how objects behind the first row of rocks aren’t drawing because they can’t be seen by the player.

LODs

Another common technique used to increase performance is the use of LODs. LOD stands for Level Of Detail and refers to a version of a 3D mesh that is visible depending on how far away the camera is. Oftentimes, multiple versions of a mesh are made with less vertices so when you’re further away, the mesh is less detailed than it is up close. LODs play a big part in why it takes significant resources to optimize our content. Our artists make each of the LODs manually, so it takes a lot of time to create them for every prop and piece of scenery in something like ILS.

These are the LODs of the barrel that appears in Isle of Lost Skulls. Depending on the distance, you see a different mesh.

These are the LODs of the barrel that appears in Isle of Lost Skulls. Depending on the distance, you see a different mesh.

One of the main benefits with having LODs is that meshes aren't always drawing the most expensive version at various distances. In Unity, we also have the option to not draw the mesh if the camera is really far away from the object, further reducing draw calls.

Wrap up

There’s other techniques we use to further increase performance, but these are two of the most common ones. We hope all the Quest 2 players enjoy Isle of Lost Skulls!