Chrono | Drop-in custom physics replication library

Chrono

Github | Documentation | Releases

About

Roblox’s default replication has several limitations that make responsive multiplayer gameplay difficult to achieve. By default, physics is replicated at 20hz, and all characters are subject to a large, non configurable interpolation delay thats designed primary for mobile devices on low bandwidth connections.

NPC replication is especially inefficient. Roblox often triggers excessive recv traffic for parts moved on the server - sometimes 10x higher than an optimized custom solution, and can also incur unnecessary send usage that is 100x more than normal. This wastes bandwidth and reduces performance.

Chrono solves all of these problems, while also improving developer experience by:

  • Bypassing roblox interpolation delay by manually forwarding cframe data to other players and creating a configurable, custom dynamic interpolation delay
  • Providing access to historical snapshot data and exposing interpolation delay, for far more accurate lag compensation
  • Optimizing server controlled entity replication by placing server controlled entities into a camera container on the server, stopping Roblox’s replication completely. Chrono then sends its own compressed replication data using a fraction of the bandwidth
  • Chrono’s API allows developers to create real time debuggers that hooks onto its snapshot and latency system, letting you view exact replication data, packet loss, and per player interpolation states.

Chrono:

chrono

Roblox:

roblox

Performance

Chrono is made with performance in mind and designed to have high replication efficiency.
It achieves this with the following optimizations

  • Batching - coalesces snapshots into a single buffer to reduce overhead
  • Serdes - packs data into buffers to be efficiently sent
  • Proximity based replication - replication frequency scales by distance
  • Movement aware replication - no packets are sent when a player is stationary and freezes the interpolation buffer to preserve accurate latency statistics

Credits to Pogo for creating BetterReplication which inspired this project.

Benchmarks are available here here
Here is another visual comparison between Roblox, Chrono and BetterReplication

Red = Roblox
Blue = Chrono
Black = BetterReplication

results

Basic Usage

--Client
local ReplicatedStorage = game:GetService("ReplicatedStorage")
require(ReplicatedStorage.Packages.chrono).Start()
--Server
local ReplicatedStorage = game:GetService("ReplicatedStorage")
require(ReplicatedStorage.Packages.chrono).Start()

Ragdolls

Many people do not know how to get working ragdolls with custom replication. Here is an example implementation: ragdoll.luau by @Tazm0ndo

Credits

  • @haotian2006, 2nd maintainer of chrono, primarily working on improving the npc system, bug fixes and more
  • ffrostfall for improving repo set up and packaging
  • Azim_us for moral support

Change Log

v1.2.1 (2025-09-18)

  • Fixes interpolation buffer being massively artificially increased when player begins moving after a period of inactivity
  • Adds custom character support decoupling from Roblox’s player.Character and also allowing players to switch characters during runtime via SetCharacter
  • Adds configuration for sending Y-rotation vs full rotation
  • More generic bug fixes

v1.1.0 (2025-08-26)

  • Add replication rules for filtering players to replicate to (SetReplicationRule, GetReplicationRule)
  • Add npc registration with initData
  • Add npc registration with provided model option
  • Add events NpcAdded, NpcRemoved
  • Add method for pausing character interpolation via TogglePlayerReplication
  • Exposed player replicators for DISABLE_DEFAULT_REPLICATION
  • Add method to modify chrono config during runtime (Before Chrono.Start() is called)
  • Disabled warnings that spammed the output by default. Can show warnings only when experiencing bugs
  • Fixed memory leak with grid not cleaning up and characters not being cleaned up
  • Fixed bug where afking causes snapshot implementation to break
  • Fixed bug where joining causes teleportation when player idles
  • Fixed rig/replicator not being moved when HRP was not the primarypart when default replication is disabled
  • Optimized npc creation
  • Optimized serialization
292 Likes


sounds too good to be true :face_holding_back_tears:

65 Likes

ima give this a try… i gave up on chickynoid and luanoid but this might be what i use for npcs

5 Likes


nice twin

30 Likes

this is widderally so gud roblox should make this perment and make everyone use it for every game

7 Likes

Twk i deserve to be credited :sad: :sad: :sad:

1 Like

yeah ngl im comepletely lost haha :sweat_smile:

3 Likes

Hello parihsz, truly some phenomenal stuff you got here, so much better than Roblox’s replication! Idk how you did it, but a cool thing would be able to pause replication for maybe like time slowdown abilities. Thanxss

9 Likes

Hey, amazing module I give it a try. I was curious about how you got that benchmarks so I read the code and I noticed you don’t use UnreliableRemoteEvent. Wouldn’t it give better performances and benchmarks ? Also it would be cool to have an exmaple place with a npc that follows you

2 Likes

Hi, not instantiating an unreliable was an oversight on my part. The way I implemented batching accounts for the unreliable remote data limit, so switching to it would not be a problem.

Also, an npc example can already be found in the npc benchmark script.

3 Likes

If my game consist of players being in a rolling vehicle, do I need to account for anything special on the vehicle side or will this just truly be a plug and play and it all just works?

Edit: The players have network ownership of the rolling vehicles they are in.

1 Like

Yes but the example doesn’t works, I have client errors

1 Like

Could it be that you forgot to call .Start() on the client? That’s the only way I see how you would be getting errors.

1 Like

Yeah it should work in that case

2 Likes

So far, everything looks to be solid. Already needed to tweak some settings per my game. For the PROXIMITY setting, it is defaulted at 100. Can you elaborate on this setting and the impact of a higher value versus lower. Ideally, the farther the proximity the more that is replicated with this which is want I want.

Basically I am just trying to find a sweet spot. I feel 100 feels a bit short with vehicles as my main fast movement.

2 Likes

this is good for me because my animals are already animated with animation controller from client

Theres still a problem tho my game uses networkownership for grab mechanics and this is not optimal for me because if i grab another player its super slow and skaggy how can i fix that?

1 Like

Also please use remote scope from blink

This looks really great, I’ll try using this since my game heavily uses Roblox physics and we’ve been having issues with the amount of data being sent/received.

Currently I’m not able to fully disable default Roblox replication due to various technical issues. How does this module improve the amount of data being sent/received while default replication is still active?

Also, if I could give feedback, a lot of the warnings seem to be notifying of non-fatal issues that naturally occur during runtime anyways… I ended up commenting out pretty much all of them.

Edit (another question): Does this module improve replication for general unanchored parts affected by physics, or only players and registered NPCs?

2 Likes

No I didn’t forget to. I also called start on server but still got the same error. Does it works for you ?

2 Likes