Hi,
Info:
DOTS project.
Entities version used 0.51.1
Netcode for Entities version 0.51.1
I am seeing 2 different issues that are contributing to jitter and performance, the first issue is regarding how many rollbacks are fitting in a given time frame and the second issue is about prediction loop and quantization.
Rollbacks:
I’ve noticed that we’re seeing more frame rollbacks than expected for a given Round Trip Time (RTT). I’m keeping an eye on the RTT from the Networking.NetDbg window.
For an RTT of 30 ms, we’d normally expect just a couple of rollbacks when the server confirms a frame for the client, usually around 2 frames. But instead, I’m seeing our system getting rolled back 7 or 8 times in these situations.
These frequent rollbacks seem to increase as the RTT goes up. In fact, with higher RTT values, we’re looking at up to 15-16 frame rollbacks.
I’m wondering if there’s a way to implement some kind of state comparison, so that if the predicted frame’s values closely match or are the same as the server-confirmed frame, we can skip the rollback.
I’m also curious about the reasons behind all these rollbacks. Our simulation is running consistently on both the server and client, and we’re using a fixed tick system group.
Any insights on this issue would be greatly appreciated.
Quantization:
I am having some weird mispredictions between server and client even when hosting locally (0 ping). When debugging it further, I noticed that quantization only happens when snapshots are serialized and not between each tick. For example:
Client(frame1) → predicts float 1.234567
Client(frame2) → predicts +1 and results to 2.234567
Server(frame1) → confirms 1.234567 and quantizes to 1.234 (quantization 1000)
Client(frame1 rollback) → sets float to 1.234
client(frame 2 replay) → +1 and results to 2.234000
At this point there will always be a small difference between server and client frames because the engine doesn’t seem to be quantizing the values locally when doing the simulation, only when serializing and sending them as packets via the network. That small value can make the difference between hitting a step and running some ledge mount logic or not. This is prone to cause frequent mispredictions.
Is there a way to force ghost fields to quantize every time they get a new value assigned to them, to be sure they stay in sync every time they change?
Does anyone know if this is a known issue that has been addressed in version 1.0? Currently, we’re using version 0.51 and working on an update. It would be helpful to understand whether there’s still work required in these areas.