Reproduction Steps
Short explanation: setting CanCollide and CanTouch to false on big physical assemblies (around 1000 parts) causes them to replicate to other clients a lot more (because physics stop throttling and can update a lot faster), which kills fps of other clients to who these assembly updates get replicated
Long explanation:
My game OneSkyVed's Trolleybuses Place (indev) - Roblox has vehicles with pretty big part count (around 1000 parts per vehicle)
Originally these vehicles were not optimized: a lot of parts had CanCollide and CanTouch set to true, which caused physics to sometimes be pretty slow/be on the edge of throttling (this part will be important later)
When roblox released CanTouch property, I decided to optimize my vehicles collision. I did it by disabling CanCollide and CanTouch on almost all parts of the vehicle (leaving around 20 parts with collision). That optimization worked well, which caused the bug I’m reporting here
The issue is, because now player computers have to process around 20 parts instead of 1000, physics do not have any throttling at all, and that means my vehicles physical assembly was replicating a lot more than it did before. This means other clients have to update position of 1000 parts a lot more often than they had to before I optimized physics, which resulted in extreme fps drops for everyone on the server. I do not have screenshots of this, but I did look into microprofiler, and this information is based on what microprofiler was showing
Expected Behavior
Replication should respect amount of BaseParts in a physical assembly, and replicate bigger assemblies less frequently, meaning FPS will not drop from replication
Actual Behavior
FPS drops severely as huge 1000 parts physical assembly gets replicated and its position gets updated too frequently for an assembly of such part count
Workaround
This issue has 3 solutions on my side:
- Enable streaming (this is what I did). Enabling streaming does not fix the issue, but avoids it most of the time, as most of the time you are not near other player vehicles
- Optimize the model to not have 1000 parts. While this is possible in theory, I dont have that much time, and because my models have a lot of animation/script related things, the bare minimum of parts is around 200 - 400
- Make it so the model will have physical throttling again by re enabling CanCollide and CanTouch on most of its parts. This is the worst solution out of the 3, but it can work as a workaround
Solution on the side of roblox might be simpler, as if replication becomes slower when physics get trottled, it’s probably possible to make it slower based on amount of BaseParts in a model too
Issue Area: Engine
Issue Type: Performance
Impact: Moderate
Frequency: Constantly