Skip to main content

Avoid Using Constraints with SPS

SPS2 fixed a lot of the old SPS1 scaling problems, but constraints are still usually not the best way to move plugs or sockets around.

Most of the time, it is simpler and more reliable to just place a separate socket wherever you want one.

Why

  • Even after all of VRC's fixes, constraints continue to introduce jitter to contacts and physbones in some rare cases. That jitter affects SPS contacts, depth animations, and haptics.
  • Re-using one socket in multiple places usually makes the setup harder to understand than just making two sockets.
  • A shared socket cannot have different tags, guided paths, menu state, animations, or legacy settings per location.
  • Auto Mode works better when each location has its own socket.
  • OGB and other haptics systems have a harder time telling which location is supposed to be active if multiple placements share one socket.
  • Constraints are still a little more fragile than just putting the SPS object where it belongs.

SPS2 note

With SPS2, the old "I need to re-use sockets to save lights" reasoning mostly does not apply anymore.

Pure SPS2 deformation does not need lights at all. If you are not using legacy compatibility, separate sockets are usually the cleanest option.

Also, disabled sockets have zero performance impact. If a socket is off, there is usually no reason to bend the setup around trying to "save" it.

Performance

If an avatar uses SPS, trying to squeeze it out of Very Poor is usually not a very useful goal.

SPS is already a choice to spend performance on a feature you want. In practice, trying to optimize around VRChat rank cutoffs often leads to worse setup decisions than just building the SPS setup the clean way.

The same goes for worlds with strict performance limits. If a world or event really cares about avatar performance restrictions, SPS is usually not a great fit there in the first place.

Recommendation

If you can:

  • Put each socket directly on the bone or object where it belongs (or use Armature Link)
  • Give each location its own socket
  • Use tags, menu toggles, guided paths, and legacy compatibility settings directly on those sockets

Short version: use constraints with SPS only when you really need to.