Does this lib actually work?

April 22, 2026 ยท View on GitHub

Yes, there's a closed-source project dedicated for the account system, backend session management and frontend rendering, here're some screen-recordings of battles over the internet (all having ping around 20ms~300ms during test).

Afterall, the underlying netcode is the same as DelayNoMoreUnity.

Yet the devil is in the details

At an early commit, I experienced bad synchronization around only 100ms ping, which was not the case in DelayNoMoreUnity. After several rounds of variable-controlled measurements, it was concluded that a difference in "character airing time" is the root cause of performance degradation.

Here's a timeline-aligned comparison of that early commit (up) v.s DelayNoMoreUnity (down).

  • Timeline is slowed down by a factor of 10, and the original recording is here.
  • The Jolt version is approximately 250ms shorter than the DelayNoMoreUnity version in the whole ascending+descending period, moreover it's 125+ms shorter only in the descending period.
  • A reduction of 125+ms only in the descending period -- when a real player often uses skills -- makes it extremely prone to peer input lag, e.g. given INPUT_SCALE_FRAMES=2 and BATTLE_DYNAMICS_FPS=60 we lost 125ms ~ 7.50 render frames ~ 1.87 input frames of peer input lag tolerance.

jump_compare_10x

I saw lots of peer character position dragged by interpolation backthen even around only 100ms ping when peer character used air dashing.

Therefore good synchronization is not all about abstract algorithm design, a matching set of magic constants is also important.

Why NOT use a "static library joltc"?

The main target joltc.dll (or libjoltc.so) is used by JoltCSharpBindings.cs via DllImport("joltc") which doesn't support static library, so there's no need to support static library build in the cmake scripts.

Why use a "static library protobuf" by default?

First of all, it's recommended by the library itself.

Besides the reasons given above, it's also important to build Google Abseil as "static libraries" for Protobuf v22+ to avoid cascade-dynamic-linking.

What if Google Abseil is built as "dynamic libraries" instead? In that case all these dependencies have to be copied for shipping on Linux -- moreover, there're internal cascade-dynamic-linking within Google Abseil itself too (e.g. absl::cord requires a few libabsl_*_internal_*.so files). That said, I did take the challenge and succeeded in building a shippable libjoltc.so by <proj-root>/start_linux_dynamic_pb_docker_container_interactive.sh (e.g. verified by a shipped C# backend service).