[Full Release] BindToSimulation & Rolling out UseFixedSimulation


Hi Creators,

Today, we’re excited to launch BindToSimulation, a long-requested feature that provides a fixed-frequency callback for framerate-independent logic.

Consistent Simulation for Every Player

Currently, script callbacks and internal engine systems (like animations and sensors) depend on a device’s framerate. This means an experience can behave differently depending on whether a player is on a high-end PC or a mobile device, leading to inconsistent gameplay.

BindToSimulation solves this by allowing you to run logic at a guaranteed frequency that is identical across all clients and the server.

Using PreSimulation at 45 FPS Using BindToSimulation with 60 Hz at 45 FPS

Smooth Suspension: BindToSimulation maintains stable physics at 60 Hz, preventing the unpredictable gameplay seen when tied to lower frame rates.

Using PreSimulation at 24 FPS Using BindToSimulation with 60 Hz at 24 FPS

Precision at Low FPS: Decoupling logic from rendering ensures the arm moves accurately and smoothly, even when the frame rate drops to 24 FPS.

Why This Matters

  • Framerate Independence: Your game logic will no longer speed up or slow down based on a user’s FPS.

  • Consistent Results: Achieve repeatable gameplay behavior across clients and server, which is required for features like Server Authority.

  • Improved Reliability: The UseFixedSimulation rollout moves internal systems—like Humanoid logic and ControllerManagers—to a fixed frequency to prevent low-FPS glitches.

Fixed Frequency Options

To balance performance with precision, we are launching with a specific set of supported frequencies:

  • Hz1, Hz5, Hz10 (Low frequency for background logic)
  • Hz15, Hz30 (Standard frequency for general movement)
  • Hz60 (High frequency for precision control systems)

Please note: If no frequency is specified, the system defaults to 30 Hz to keep compute costs lower by default.

How to Use BindToSimulation

  1. Call the API: Use RunService:BindToSimulation(callback, frequency).

  2. Select Frequency: Pass one of the Enum.StepFrequency options listed above.

  3. Check Attributes: To lower the load on the physics system, only properties marked with the Simulation Access attribute can be modified during a callback.

Code Example

Lua

local RunService = game:GetService("RunService")
local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()

-- Run character movement at a fixed 15Hz regardless of client FPS
RunService:BindToSimulation(function(dt)
	local cm = character:FindFirstChildOfClass("ControllerManager")
	if cm then
		local moveInput = player.InputContexts.Character.Move:GetState()	
		cm.MovingDirection = Vector3.new(moveInput.X, 0, moveInput.Y)
	end
end, Enum.StepFrequency.Hz15)

The UseFixedSimulation Rollout

In addition to the new callback, we are rolling out UseFixedSimulation. While BindToSimulation works independently, enabling this rollout ensures engine consistency by syncing internal systems to a fixed update frequency across all clients and the server.

This rollout specifically standardizes the timing for:

  • Animation tracks and playback speed.
  • Humanoid logic and state calculations.
  • ControllerManagers and physics sensors.

UseFixedSimulation will follow these three stages:

  1. Opt-In (Current): Default is set to Disabled. You can manually set it to Enabled to begin testing.

  2. Opt-Out: Default will be set to Enabled. You can still manually disable the feature temporarily if you encounter compatibility issues. Please report any issues that require you to opt-out.

  3. Enabled Everywhere: The feature will be permanently enabled for all experiences to ensure global engine standardization.

We do not have a finalized date for the transition to the Opt-Out phase, but we will provide an update with plenty of lead time before any changes occur. We highly recommend testing this property in your experiences today to ensure a smooth transition.

We’ve heard your requests for better simulation tools. We can’t wait to see how this improves your competitive and physics-heavy experiences. Please share any feedback and demos you build with this tech in the comments below!

Happy Building,

Roblox Physics Team

264 Likes

This topic was automatically opened after 10 minutes.

This is without a doubt the best update that has ever been released to Roblox I don’t care what anyone says

37 Likes

This is actually huge. We’ve been dealing with FPS-dependent bugs forever, so having a fixed simulation step finally is a big deal. This should make movement, combat, and physics way more consistent across devices. Really excited to try this out, especially with server authority coming.

28 Likes

Now we just need an update to fix light leaking through wall

26 Likes

These are very great additions! But I have one concern/complaint which is that I wish that there was a 120Hz mode. I get that for most use cases 60Hz is enough but since I use a high refresh rate monitor, I can immediately notice the way lower animation stepping rate which makes animations look laggy in perception. I also simply think that 120Hz may be a great addition for high fidelity simulations due to the greatly improved accuracy at e.g. high speeds. This may or may not also relate to me still wishing higher fidelity aerodynamics simulation as a potential option along side the addition of boosted compute services. Thanks for taking your time! :slight_smile:

18 Likes

I’m so glad to finally see this API rolled out to everyone, it’s very useful not only in Server Authority, but in a bunch of different places as well!

Also, can’t wait for Server Authority full release!

3 Likes

Yes the animation issue is complicated. Other engines sort this out through interpolation but Roblox doesn’t lend itself well to that. Ideally animations would be able to step at 60 Hz minimum, moving to higher rates as heartbeat rate increases. The way you get smooth animations at any rate, combined with deterministic simulation, but the issue is at higher heartbeat rates you are changing the bone positions between physics steps where nothing should change, potentially introducing non deterministic behavior. I really wonder what they will do about that.

9 Likes

So basically with this in horror asyms stamina drain and regen will not bend for the player’s framerate? amazing

2 Likes

epic.

Now I can fully remake Claude Code’s Routines in Roblox- cough

That aside, this is REAL helpful, allowing us to delegate scripts to the background to be handled at intervals rather than having to rely on FPS.
A great update, you guys.

2 Likes

Gone are the days of your car jumping in Jailbreak. Great update.
yippie-truck

28 Likes

would there still be issues if the server’s frame rate fluctuates drastically?

1 Like

Very cool update, I have only one problem: after enabling UseFixedSimulation, my FPS has essentially halved, and a system I had which rotated the player’s head in the direction they are facing is broken now.

4 Likes

I havent seen this happen to me, do you mean the actual FPS or just simulation rate?

1 Like

My actual FPS has halved. The place I am testing this in runs at 240 FPS+ with this property disabled, and it dropped to 110~ FPS when enabled.

3 Likes

Oh my god I’ve been waiting for this for years! Thank you roblox physics team <3

2 Likes

yooo this is cool

though one pretty big issue is that animations feel choppy with a high refresh rate since they’re locked to 60hz :frowning:

7 Likes

“45 FPS is still 60 physics FPS, right?”
The humble UsingPreSimulation at 45 FPS GIF:

2 Likes

I noticed after enabling this if I set transform on any of my motors they don’t seem to update?
Playing animations works but I can’t seem to manually set the transform anymore.

3 Likes

look at the output, you get an error when setting motor6d in bindtosimulation

2 Likes