From 6791add18992948f8bf30df4e0621519c75b4f4f Mon Sep 17 00:00:00 2001 From: mischa Date: Mon, 28 Oct 2024 11:44:41 +0100 Subject: [PATCH] server->client half as deltas --- .../NetworkTransformHybrid2022.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid2022.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid2022.cs index 981c71234..a6fcc2e68 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid2022.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid2022.cs @@ -381,7 +381,10 @@ void RpcServerToClientDelta_PositionRotation(byte baselineTick, Half x, Half y, if (IsClientWithAuthority) return; // Half: +-65k with 0.0001 precision is enough for deltas - Vector3 position = new Vector3((float)x, (float)y, (float)z); + Vector3 positionDelta = new Vector3((float)x, (float)y, (float)z); + + // reconstruct full position from delta + baseline + Vector3 position = lastDeserializedBaselinePosition + positionDelta; OnServerToClientDeltaSync(baselineTick, position, rotation);//, scale); } @@ -395,7 +398,10 @@ void RpcServerToClientDelta_Position(byte baselineTick, Half x, Half y, Half z) if (IsClientWithAuthority) return; // Half: +-65k with 0.0001 precision is enough for deltas - Vector3 position = new Vector3((float)x, (float)y, (float)z); + Vector3 positionDelta = new Vector3((float)x, (float)y, (float)z); + + // reconstruct full position from delta + baseline + Vector3 position = lastDeserializedBaselinePosition + positionDelta; OnServerToClientDeltaSync(baselineTick, position, Quaternion.identity);//, scale); } @@ -582,11 +588,15 @@ void UpdateServerDelta(double localTime) // TransformSnapshot snapshot = ConstructSnapshot(); target.GetLocalPositionAndRotation(out Vector3 position, out Quaternion rotation); + // send the delta since last baseline, not the full position. + // TODO rotation delta too? + Vector3 positionDelta = position - lastSerializedBaselinePosition; + // Half: +-65k with 0.0001 precision is enough for deltas. // and this cuts position sync bandwidth in half. - Half x = (Half)position.x; - Half y = (Half)position.y; - Half z = (Half)position.z; + Half x = (Half)positionDelta.x; + Half y = (Half)positionDelta.y; + Half z = (Half)positionDelta.z; // save bandwidth by only transmitting what is needed. // -> ArraySegment with random data is slower since byte[] copying