[VRChat] Reducing Physics Load: Let Things Sleep, and Cut What They Hit

Created: 2026-09-08Last updated: 2026-09-09

Confirming that settled props are asleep and eliminating what keeps them awake. Covers cutting collision pairs with layers, and why to avoid Mesh Colliders.

You lined up props in your room. A cup on the table, a ball on the floor, an ornament on the shelf. All of them throwable.

It looks good and somehow runs heavy. Nobody is touching anything, nothing is moving, and the frame rate won't climb.

Calculation keeps running on things that have finished rolling. This article covers two ways to stop it.

Props settled on the floor, sleeping quietly

What You'll Learn

  • The mechanism that puts stopped objects to sleep
  • What keeps them awake, and how to eliminate it
  • Cutting collision pairs with layers
  • Why to avoid Mesh Colliders

Start from having read collision basics and measuring performance.

Sponsored


Stopped objects are still being calculated

Anything with a Rigidbody gets "where does it move next" calculated every step. After it falls to the floor and stops, that calculation continues if left alone.

Sleep is the mechanism for that.

Sustained tiny motion leads to sleep; contact wakes it

When motion stays very small for a while, Unity puts the object to sleep. While asleep, almost no calculation happens. Anything hitting it or applying force wakes it automatically.

Done right, every prop that's just sitting there sleeps. Twenty of them cost almost nothing while nothing moves.

The problem is the ones mixed in that don't sleep. The causes narrow down to three.

CauseWhat's happening
Sitting on a slight slopeSliding imperceptibly, continuously
Colliders slightly overlappingPushed apart repeatedly, jittering
A script touching it every frameBeing moved, so it never meets the sleep condition

We'll build a way to tell later. First, develop the instinct to ask whether a placed object is asleep. Just knowing to check changes physics load dramatically.

Cut what they collide with

The other approach is cutting the pairings.

Physics checks "which of these hits which" across all combinations. As the count rises, the combinations grow sharply.

Splitting layers cuts the combinations checked

Layers are the tool here. You tag objects and decide "this tag and that tag don't collide."

Do decorative cups need to collide with each other? Does a sign on the wall need to collide with a ball on the floor? Most decorations only need to collide with the floor.

Configure it in "Edit → Project Settings → Physics" under Layer Collision Matrix. A grid of checkboxes decides which combinations get checked.

One caution: don't change settings for layers VRChat uses.

LayerSafe to touch?
Player, PlayerLocal, Pickup, Walkthrough, MirrorReflection, and friendsDon't touch
Free slots from index 22 onwardUse freely

Combinations among layers you created can be cut and reconnected safely.

Sponsored

Hands-On: Lighten a room full of props

In a room with props lined up, confirm they're asleep and cut the pairings with layers.

1. Line up props and measure

Place about twenty Spheres in a scene with a floor. Add a Rigidbody to each and offset them slightly from around (0, 1.2, 0).

Press Play and wait for them all to settle. Then open the Profiler and note the thickness of the Physics-related band. You don't need to read the numbers precisely — remembering the thickness is enough.

2. See whether they're asleep

You can't tell by looking. Build a tool to check.

The awake count going from three to zero

Place a World Space Canvas and TextMeshPro named SleepText, and create SleepWatcher in Assets/Scripts.

using UdonSharp;
using UnityEngine;
using TMPro;

// For checking. Remove it once you're done
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class SleepWatcher : UdonSharpBehaviour
{
    [SerializeField] private Rigidbody[] targets;
    [SerializeField] private TextMeshProUGUI display;

    private void Update()
    {
        int awake = 0;
        for (int i = 0; i < targets.Length; i++)
        {
            if (targets[i] != null && !targets[i].IsSleeping()) awake++;
        }

        if (display != null)
        {
            display.text = "Awake: " + awake + " / " + targets.Length;
        }
    }
}

Drag all twenty Rigidbodies into Targets at once. Multi-select in the Hierarchy and drop them into the field.

Press Play and wait a while.

DisplayMeaning
Awake: 0 / 20All asleep. Ideal
Awake: 3 / 20Three can't sleep. Find the cause

That's the most important number in this article. If the count won't drop while everything looks settled, something is jittering.

This script uses Update(). That's fine for a measuring tool, and remove it once you're done checking. It costs performance itself.

3. Fix what won't sleep

If the count doesn't reach zero, work down this list.

  1. Check the floor is level → See that all Rotations are 0. Even a slight tilt keeps things sliding
  2. Resolve overlaps → Check in the Scene view whether objects intersect each other or the floor. Lift and reseat them slightly
  3. Remove scripts touching them → Look for logic writing position or velocity every frame

After fixing, Play again and confirm Awake: 0 / 20.

4. Cut the pairings with layers

From "Layer" at the top right of the Inspector, choose "Add Layer..." and type WorldProps into a free row from index 22 onward.

Select all twenty props and set Layer to WorldProps. If asked whether to change children too, say yes.

Open "Edit → Project Settings → Physics" and set the Layer Collision Matrix like this.

CombinationChecked
WorldProps × Default (the floor)On
WorldProps × WorldPropsOff

The props no longer collide with each other. They still land on the floor and pass through one another.

5. Measure again

Play again and look at the Profiler band.

FieldBeforeAfter
Awake Rigidbodies
Thickness of the Physics band

Whether props passing through each other is acceptable depends on the world. For decorations it's fine. For things you stack and play with, this setting isn't usable.

Lightness and feel trade off. Which you take is decided by what the object is there for.

Sponsored

Common Pitfalls

  • The asleep count won't rise → Check floor tilt and overlaps between objects. Those two cover most cases
  • Once touched it stays awake → It's still moving imperceptibly. Look at friction settings, or reposition it
  • Changing layers made things ungrabbable → You changed a Pickup-related layer. Leave grabbable objects as they were
  • Players started passing through things → You changed settings on a layer VRChat uses. Put them back
  • Props fall through the floor → They're falling too fast. Lower the drop height, or thicken the floor's collider
  • The checking display is heavy → Remove SleepWatcher. Its job is done

Bonus: Good to Know Up Front

  • Mesh Colliders are heavy: They build collision matching the visible complex shape, so calculation grows. Attaching one to a moving object requires Convex, which caps the triangle count. Consider whether boxes, spheres, and capsules can substitute first
  • Don't put Rigidbodies on decorations: Static things need only a Collider. A Rigidbody added "in case I move it someday" often just stays there
  • Rethink the design past triple digits: A few dozen is covered by sleep alone. Beyond that, reconsidering whether all of them need to move is faster
  • Don't touch Fixed Timestep: Changing the physics step interval changes overall behavior. Leaving it alone is safest
  • Leave Continuous Collision Detection at the default: It prevents fast-moving objects tunneling through, and adds calculation. Don't change it unless you have the problem

Summary

Lightening physics is two subtractions.

  • Let stopped objects sleep. Count with IsSleeping() to confirm
  • What keeps them awake is tilt, overlap, or per-frame manipulation
  • Cut collision pairings with layers. Don't touch VRChat's layers
  • Avoid Mesh Colliders. Don't put Rigidbodies on decorations

The question to ask before placing something is: "Does this need to move?" If no, it doesn't need a Rigidbody.

To lighten the mechanisms, go to making Udon lighter. For the visual side, go to making rendering lighter.

VRChat Notes in this section63