PoppyOS

Home › Guides › VRChat's 256-bit parameter limit: how it is counted and how to find wasted bits

VRChat's 256-bit parameter limit: how it is counted and how to find wasted bits

You add one more toggle to your avatar and Unity tells you the Expression Parameters are over budget. VRChat lets an avatar sync only a fixed amount of custom parameter data to other players, and most avatars run out because of leftovers, not because every toggle earned its place. This guide explains how the bits are counted and how to find the ones you can win back.

How the budget is counted

These figures come from VRChat's Animator Parameters page, as read on 2026-11-01.

That is 256 synced Bools, or 32 Ints or Floats, or a mix. Each Int that only ever holds 0 or 1 is eight times the cost of the Bool it could have been.

Where the waste hides

Count it yourself

The script below takes a list written out by hand from the Inspector, with the type, the Synced box and the bit width, plus the values your animator conditions actually compare against. It totals the synced bits and lists what could be recovered. The avatar is made up.

params = [  # name, type, synced, bit width (VRChat defaults: Int and Float 8, Bool 1)
    ("Outfit",    "int",   True,  8),
    ("TailFluff", "int",   True,  8),
    ("Hat",       "bool",  True,  1),
    ("Hat",       "bool",  True,  1),
    ("EarTwitch", "float", True,  8),
    ("OldToggle", "bool",  True,  1),
    ("",          "bool",  True,  1),
    ("Hoodie",    "bool",  False, 1),
]
values_used = {"Outfit": {0, 1, 2, 3}, "TailFluff": {0, 1}}  # numbers the animator compares against
nothing_reads = {"OldToggle"}                                   # no controller, menu or driver uses it

BUDGET = 256
total = sum(bits for _, _, synced, bits in params if synced)
print(f"{total} of {BUDGET} synced bits used, {BUDGET - total} free\n")

saved, seen = 0, set()
for name, kind, synced, bits in params:
    if not synced:
        continue
    if name == "":
        print(f"(empty name): {bits} bit, remove the row")
        saved += bits
    elif name in seen:
        print(f"{name}: listed twice, the second row costs {bits} bit, remove it")
        saved += bits
    elif name in nothing_reads:
        print(f"{name}: nothing reads it, {bits} bit")
        saved += bits
    elif kind == "int" and name in values_used and max(values_used[name]) <= 1:
        print(f"{name}: only ever 0 or 1, make it a Bool: saves {bits - 1} bits")
        saved += bits - 1
    elif kind == "int" and name in values_used and bits > 2:
        need = max(2, max(values_used[name]).bit_length())
        if need < bits:
            print(f"{name}: values reach {max(values_used[name])}, a {need}-bit width holds that: saves {bits - need} bits")
            saved += bits - need
    seen.add(name)
print(f"\nrecoverable: {saved} bits, leaving {total - saved} bits used of {BUDGET}")
28 of 256 synced bits used, 228 free

Outfit: values reach 3, a 2-bit width holds that: saves 6 bits
TailFluff: only ever 0 or 1, make it a Bool: saves 7 bits
Hat: listed twice, the second row costs 1 bit, remove it
OldToggle: nothing reads it, 1 bit
(empty name): 1 bit, remove the row

recoverable: 16 bits, leaving 12 bits used of 256

On this made-up avatar that is 28 of 256 bits used and 16 recoverable, which would leave 12 bits in use. The Hoodie Bool is not synced, so it costs nothing either way.

Before you change anything

Doing the scan inside Unity

Our own Parameter Budget Auditor does the scan from a window in the editor. You pick the avatar and press Scan, and it lists empty, duplicate and unused parameters and the Ints that only use 0 and 1, and its one-click removal can be undone with Ctrl+Z. It has limits you should know about. It counts every synced Int and Float as 8 bits, so if you have already lowered some bit widths its total will read higher than VRChat's; the lists of empty, duplicate and unused rows do not depend on that. It does not shrink bit widths or turn Ints into Bools for you. It was tested in Unity 2022.3.22f1 with VRChat Avatars SDK 3.7.6 on one test avatar, not on a wide range of real ones.

Last updated 2026-11-01. The Python on this page was run on that date and the output shown is the real output. The bit costs are from VRChat's documentation as read on that date; we have not run this in Unity or VRChat for this page.

More guides

All guides