Avatar culling hides avatars but does not unload their PhysBones. This means your CPU is simulating PhysBones for every avatar that has loaded near you, not just the ones you can see. In a populated world this adds up fast.
You can confirm this with the PhysBones debug overlay — enable it while culling is active and you can still see PhysBones moving on hidden avatars.
Repro:
Join a populated world, no avatar limit set
Hand Menu → Settings → Culling → Show Nearest X Avatars → set to 0
Radial Menu → Options → Avatar → Avatar Overlay → PhysBones → enable
PhysBones are still active on hidden avatars. The debug view has a range cutoff but performance confirms they're running beyond that
Hand Menu → Safety → switch to any safety preset to force avatars to fully reload
PhysBones are now gone, performance improves
Set your avatar limit back to what you want — performance is better, but degrades over time as new avatars load in and their PhysBones never unload
Tested on: i9-12900K, RX 7900 XTX, 32GB RAM — public world, 30-40 players. in the instance pictured i went from 100 - 150fps by hiding physbones
Dynamic Bones had limiter settings. PhysBones removed them, which wasn't a big deal at launch, but avatars use a lot more PhysBones now than they did back then.
The fix needed: PhysBones should unload when an avatar is culled.
A user-facing PhysBone simulation limit would also go a long way.
Also noticed in this session many many users with physbones active for hidden meshes if some wizard can make these disable when the meshes referenced to the bones hide would also be a great optimization

Photo Viewer

View photos in a modal