Your world feels heavy. You search and try every fix you find. Shrink the textures, cut the lights, combine the meshes. Half a day later, it feels about the same.
Heaviness comes in kinds, and the fixes are completely different. Nobody with a fever swallows every bottle in the cabinet.
This article covers finding what's heavy. The fixes are handed off to their own articles.
What You'll Learn
- Thinking of heaviness as four kinds
- How to narrow it down from how it feels
- When to use each of the four measurement windows
- How to keep records for before-and-after comparison
If you have a world of your own on hand, read along with it.
There are four kinds of heavy
"Heavy" as one word splits into four things.

Happily, how it feels narrows it down to a degree.
| How it feels | What to suspect | Common causes |
|---|---|---|
| It stutters especially when you swing the camera | Rendering | Material count, polygons, overlapping transparency |
| It's heavy even idle. Stopping the mechanisms lightens it | Processing | Udon, physics, animation |
| Entering takes a long time. It crashes on Quest | Size | Textures, audio, meshes |
| Light alone, heavy as people arrive | Synchronization | The number of synchronized objects |
These four categories are the most important part of this article. Being clear about which one you suspect settles which article to read.
| What you suspect | Article to read |
|---|---|
| Rendering | making rendering lighter |
| Processing | making Udon lighter, reducing physics load |
| Size | materials and textures |
| Synchronization | networking basics |
Let's separate two that get conflated up front.
- Slow entry and stuttering motion are different. The former is size, the latter is rendering or processing
- Heavy rendering and heavy processing are different too. Heavy while drawing nothing means processing
Looking through four windows
There are four tools too, each showing something different.

| Tool | Where to open it | What it shows |
|---|---|---|
| Stats | "Stats" at the top right of the Game view | How much is being drawn right now |
| Profiler | Window → Analysis → Profiler | The breakdown of one frame's time |
| Frame Debugger | Window → Analysis → Frame Debugger | The order in which one image is built |
| Build size | The SDK's build panel | How much visitors download |
Stats is the easiest. Show the Game view and press "Stats" at the top right.
Four numbers are enough to watch.
| Field | Meaning |
|---|---|
| Batches | How many times things were drawn together |
| SetPass calls | How many times the drawing method switched. This one bites |
| Tris | Triangle count |
| Verts | Vertex count |
Start with SetPass calls. It grows with the number of material types, and worlds heavy on rendering usually have it inflated.
Treat these targets as one reference point.
| For PC | For Quest | |
|---|---|---|
| SetPass calls | Up to around 100 | Up to a few dozen |
| Tris | Up to a few hundred thousand | Around 100,000 |
These aren't absolute pass lines. What matters is comparing before and after your changes.
Hands-On: Measure your own world
Measure your own world through all four windows. A work in progress is fine.
1. Fix where you measure
First, fix the measurement conditions. Without that, the numbers scatter and can't be compared.
- Pick one place to stand (the room's center, say)
- Pick a direction to face (whichever shows the most objects)
- Note the camera position in the Scene view so you can return there easily
Measure the heaviest view. A good number facing a wall means nothing.
2. See rendering in Stats
Press Play, stand at your chosen place and direction, and press "Stats" in the Game view.
Note the four numbers. You'll compare later, so a notepad or text file is fine.
SetPass calls :
Batches :
Tris :
Verts :
Turn in place and watch how the numbers move. If they change a lot with direction, something heavy is that way.
3. See processing in the Profiler
Open "Window → Analysis → Profiler" and press Play.
Once the graph starts flowing, pause somewhere and select one frame. The bottom half shows what that frame spent time on.
Beginners only need two places.
| Where to look | What it tells you |
|---|---|
| The CPU Usage bands | Whether processing or rendering is thicker |
| The top of the Hierarchy view | The names of what's eating time |
PhysicsUpdate at the top means physics; Udon-related entries mean your mechanisms; a thick Camera.Render means rendering. You don't need to read the names precisely. Knowing which category is thick is enough.

4. See draw order in the Frame Debugger
Open "Window → Analysis → Frame Debugger" and press "Enable."
On the left, the steps for building one image are listed. Moving the slider shows the image up to that point in the Game view. You watch the picture assemble itself.
Two things to look for.
- Are similar objects being drawn dozens of times separately? (They may be combinable)
- Is something being drawn that shouldn't be visible? (behind a wall, say)
Think of it as the tool for inspecting the contents when Stats showed a high SetPass calls.
5. See size by building
Open the VRChat SDK's build panel.
Building displays the download size and the uncompressed size. Note both.
Download Size :
Uncompressed Size :
If people say entering takes a long time, this is what's grown. Whether you're approaching the limit shows on this panel too.
Most of the size is textures. When it feels large, suspect texture resolution and count first.
6. Keep a record
Finally, gather the numbers into one table.
| Field | Before | After |
|---|---|---|
| SetPass calls | ||
| Tris | ||
| Download Size | ||
| The thick entry in the Profiler |
Having this table makes optimization work an entirely different activity.
Without numbers, you end with "I think it feels lighter, maybe." With numbers, you can say "SetPass calls went from 180 to 60." You also learn which work didn't help, so you don't repeat it.
When measuring doesn't tell you
- The Stats numbers don't move → The Game view isn't shown, or you aren't in Play
- The Profiler is unreadable → Don't try to read the names. Just look at where the thick band is
- Light in the editor, heavy on device → The editor is a guide. Always confirm Quest on the device
- Heavy as people arrive → That's synchronization. Count your synchronized objects
- Nothing looks large → It may be accumulation. Delete things gradually and find where it lightens
- The numbers differ every time → Your standing position and direction aren't fixed
Bonus: Good to Know Up Front
- Don't conflate this with avatars: The "Performance Rank" you see around is an avatar metric. Worlds are judged by looking at the numbers yourself
- Change one thing at a time: Fixing three places at once leaves you unsure which helped. Change one, measure, record. Unglamorous, and the fastest way forward
- Don't measure from the light room: Measure the view with the most objects. Good numbers give reassurance and teach you nothing
- Measure early if Quest is in scope: Halving the size after finishing is painful. Build periodically while building and watch how the size grows
- Measuring isn't only for the end: Building the habit of measuring right after adding a large asset or one mechanism narrows causes to one thing
Summary
Optimization starts with measuring.
- Heaviness comes in four kinds: rendering, processing, size, synchronization. Different fixes
- How it feels narrows it down to a degree
- Stats for rendering, the Profiler for processing, the Frame Debugger for rendering's contents, the build panel for size
- Keep before-and-after numbers in a table. Change one thing at a time
The question to ask before acting is: "Which of the four am I trying to fix right now?" If you can't answer, you're still at the measuring stage.
To make rendering lighter, go to making rendering lighter. To make your mechanisms lighter, go to making Udon lighter.