VRChat

The VRChat Documentation Hub

Welcome to the VRChat Documentation hub. You'll find comprehensive guides and documentation to help you start working with VRChat as quickly as possible, as well as support if you get stuck. Let's jump right in!

Get Started    

Quest Content Optimization

Creating content for VRChat Quest is a challenge-- you have to create attractive, compelling content all the while keeping the content optimized for a mobile device. These are the same challenges that game developers must deal with while building for mobile.

Here, we'll give you some general guidelines of what you need to keep in mind while building content for VRChat Quest.

The items below will apply to both avatars and worlds unless otherwise noted.

Unity has a guide for Seven Stages of Optimization for Mobile VR which has quite a lot of good points.

There's also this excellent video on optimizing your VR content by Lucas Rizzotto! It is very well done and covers a lot of what we cover here. This video was not created by VRChat or for VRChat specifically, and as a fair warning, contains some harsh language. A lot of the items in this post are covered in this video.

As a final note, all items on this list are subject to change. In other words, we're not quite done nailing down restrictions and recommendations, so keep that in mind.

Unity Profiler

We strongly, strongly recommend that you check out the Unity Profiler. Using the profiler, you can quantify precise values for various performance metrics for your world or avatar. Of particular interest is probably the number of draw calls in a scene, or the proportional amount of frame time a component uses.

Of course, the profiler on your powerful PC won't represent how a profiler on the Quest might look, but you can still see that X component is using a ton of frame time versus rendering, or etc. Its all relative!

There's lots of tutorials on how to use the Unity Profiler out there, including two from Unity: Profiler Overview for Beginners and the intermediate Introduction to the Profiler. These tutorials were made for older versions of Unity, but still cover the basic concepts quite well.

Polygon Count

Keeping polygon count low is very important on mobile platforms. Although the Quest is quite powerful for a mobile headset, its hardware does have limits. Keeping an eye on your polygon count is very important to keep performance high.

These recommendations may be technically enforced-- in other words, if your content goes over these numbers, they may not show in the application at all.

Worlds

While building worlds, you should try to keep polygon count low. You want to leave room for the user's avatars as well. We recommend that you budget approximately 50,000 triangles for your world in total.

Avatars

The same general rules apply for avatars that apply for worlds. Keep in mind that you may have 10 or more users in the same room, so you'll want to budget your triangle usage pretty heavily. We recommend that you aim for 5,000 triangles for your avatar.

This will be a challenge for avatar authors that prefer to import characters from various platforms rather than create an avatar themselves. Decimation down to this level can be destructive, and you may need to look into techniques like retopologizing geometry to keep your polygon count low.

Mesh Count

This applies to both worlds and avatars.

No matter what tool you use to do it, you should limit the number of meshes you use in your content. For static objects in worlds, this isn't so important (due to the need for occlusion culling) but for avatars, it is exceedingly important.

You should only ever have one Skinned Mesh Renderer on your avatar. Any accessories or additions to your avatar should be done in 3D editing software like Blender, and merged into the original mesh. Any animations or movement should be handled via shape keys or bones.

For worlds, you should think in terms of "objects" in the world. A set of pots on the ground could be a single object, but you probably wouldn't want to merge the set of pots into the ground mesh. Otherwise, you might run into various optimization issues as well as difficulty with editing the world later on.

Materials

Reducing material count is important for both avatars and worlds. Additional materials creates additional submeshes, which costs draw calls. Reducing the number of draw calls necessary to render your viewport is very important.

Worlds

You should aim to have the minimal possible material count for your world. That being said, you can be a little less careful with the world than you are with avatars. Its best to think of your world as a collection of objects, and combine materials accordingly.

For example, if you have a beach scene, a chair/umbrella/blanket set should probably be a single material on a single texture atlas. A set of rocks a little bit farther down the beach would be another material and texture. That way, you can separate out the object for occlusion culling purposes.

Getting too aggressive with combining materials and atlasing in worlds results in some non-optimal behavior when Unity does batching and its own runtime optimization.

Avatars

You should be aiming for 1 material on your avatar, although having 2 in cases where you need a different shader variant may be permissible. Atlasing textures is essential.

Avatars and Worlds

You should be enabling GPU Instancing on all of your materials. Although the actual use case of this is more complex and technical, it is best just to turn it on.

Textures

Concerns for texture size apply evenly across both avatars and worlds, but keep in mind that avatar texture size should be reduced, as you'll have multiple avatars in a single instance (but only one world).

Keeping texture size low is important. You should aim for using 1k (1024x1024) resolution textures at maximum. You should also create efficiently packed atlases, allowing for more texture resolution in the same size.

Lighting

This section only applies for worlds.

Baking lighting for your world is essential. It is not unreasonable to write off real-time lights completely, as they are very expensive. Make extensive use of baked lighting and light probes. Keep your lightmap resolution low. Even with low lightmap resolution, lighting can look very good.

Occlusion Culling

This section only applies for worlds.

Baking occlusion culling is exceedingly important. Doing so will allow the hardware to only render what it needs to, and ignore what you can't see. Setting up occlusion culling doesn't take long at all.

This is also the reason you don't want to be too aggressive in merging meshes in worlds-- if you've got some objects like a building set on some ground, you probably don't want to merge the building mesh into the ground mesh so you can cull out the building.

Bone Count

Keeping bone count low is important to keep the cost of skinning calls low. If a bone isn't animated by an animation or by the rig, you should merge its weights into its parent and delete the original bone. Tools like Cat's Blender Plugin make this exceedingly easy.

Since Dynamic Bones is disabled on VRChat Quest, this means that there's no need for extra bones for dynamic bits. You'll want to merge the weights for those bones into their parents.

Shaders

Shaders are restricted in VRChat Quest, and you can only use Unity's built-in shaders, including the Unity Mobile shaders.

You should be using the Unity Mobile shaders as much as possible. There are many variants, including a Bumped Diffuse that supports normal maps, or a Specular Diffuse that supports specular reflections. They're highly optimized, very efficient, and cover the majority of use cases.

You should avoid needing transparency completely. Alpha fill rate is a significant performance sink for mobile GPUs, so design around not having transparency whenever possible.

Other Components

Dynamic Bones

Dynamic Bones is disabled completely in VRChat Quest.

Cloth

Cloth components are disabled completely in VRChat Quest.

Cameras

Camera components are disabled on avatars in VRChat Quest.

They are permitted in worlds, but you should be careful not to go overboard with them.

Lights

Lights are disabled completely on avatars in VRChat Quest.

Post Processing (v1 and v2)

Post processing systems are disabled completely in VRChat Quest.

Audio Sources

Audio sources are disabled completely on avatars in VRChat Quest.

Audio sources are restricted in worlds in VRChat Quest.

Rigidbodies, Colliders, and Joints

Rigidbodies, colliders, and joints are disabled completely on avatars in VRChat Quest.

They are permitted in worlds, but you should be careful not to go overboard with them.

Particles

Particles are limited heavily on avatars in VRChat Quest.

Numbers for limits pending.

Quest Content Optimization


Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.