You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Network RTT calculation significantly inaccurate after ServerChangeScene #3576
Describe the bug
The Network RTT calculation becomes highly inaccurate after an online scene is loaded with ServerChangeScene. This is due to all messages being blocked by server and client whenever a scene is being loaded. If the scene takes a long time to load, EMA for NetworkTime.cs will be thrown off.
How can we reproduce the issue, step by step:
Using "Room" example...
In OfflineScene, add NetworkPingDisplay component to the NetworkRoomManager game object.
-> Since the example room scene is simple, it loads really fast, so we need to artificially create a loading delay.
Open project on new instance of Unity editor (could use ParrelSync)
Run game on both Unity editors (start host on one, start client on the other)
Ready players on both clients, and start game on host client
Scene should take 5 seconds to load after which you should see the RTT on the client rise significantly (usually in the 1000s)
Expected behavior
Ideally, NetworkPingMessage should still go through while loading a scene so that server/client RTT calculation always stays as accurate as possible.
Screenshots
Desktop:
OS: Windows
Build target: Android, Windows
Unity version: v2021.3.8f1
Mirror branch: master
Additional context
After a while, the RTT will settle back down to a more accurate number, usually this takes a few seconds to happen.
okay so the above repro is not valid because it sleeps after the scene was loaded.
in other words, that's just a server freezing randomly - which is expected to increase RTT.
however, this is more fitting repro for the issue:
NetworkManager.ServerChangeScene gets an artificial 5s delay right after LoadSceneAsync(), simulating a slow scene load:
publicvirtualvoidServerChangeScene(stringnewSceneName){if(string.IsNullOrWhiteSpace(newSceneName)){Debug.LogError("ServerChangeScene empty scene name");return;}if(NetworkServer.isLoadingScene&&newSceneName==networkSceneName){Debug.LogError($"Scene change is already in progress for {newSceneName}");return;}// Debug.Log($"ServerChangeScene {newSceneName}");NetworkServer.SetAllClientsNotReady();networkSceneName=newSceneName;// Let server prepare for scene changeOnServerChangeScene(newSceneName);// set server flag to stop processing messages while changing scenes// it will be re-enabled in FinishLoadScene.NetworkServer.isLoadingScene=true;loadingSceneAsync=SceneManager.LoadSceneAsync(newSceneName);// ARTIFICIAL DELAYThread.Sleep(5000);// ServerChangeScene can be called when stopping the server// when this happens the server is not active so does not need to tell clients about the changeif(NetworkServer.active){// notify all clients about the new sceneNetworkServer.SendToAll(newSceneMessage{sceneName=newSceneName});}startPositionIndex=0;startPositions.Clear();}
this is a better repro, so the client doesn't immediately enter the scene either.
working on the fix now.
Activity
MrGadget1024 commentedon Oct 29, 2023
Need to reset RTT after scene loading.
miwarnec commentedon Nov 15, 2023
great bug report @Mr-Oregano , I can reproduce it:

miwarnec commentedon Nov 15, 2023
okay so the above repro is not valid because it sleeps after the scene was loaded.
in other words, that's just a server freezing randomly - which is expected to increase RTT.
however, this is more fitting repro for the issue:
NetworkManager.ServerChangeScene gets an artificial 5s delay right after LoadSceneAsync(), simulating a slow scene load:
this is a better repro, so the client doesn't immediately enter the scene either.
working on the fix now.
miwarnec commentedon Nov 15, 2023
resetting NetworkTime statics isn't enough.

we are still receiving messages with high rtt:
miwarnec commentedon Nov 15, 2023
client is still receiving about 50 messages from the previous scene with the previous old time.
we need to disregard them somehow.
fix: #3576 Pings are now stamped with a scene hash so we can drop mes…
miwarnec commentedon Nov 15, 2023
fix is ready, see PR linked above
fix: #3576 Pings are now stamped with a scene hash so we can drop mes…
Revert "fix: #3576 Pings are now stamped with a scene hash so we can …
fix: #3576 Pings are now stamped with a scene hash so we can drop mes…
miwarnec commentedon Nov 17, 2023
reopening, had to revert the original fix since it breaks tanks/billiards demos with latency sim.
new pr: #3656
fix: MirrorNetworking#3576 Pings are now stamped with a scene hash so…
Revert "fix: MirrorNetworking#3576 Pings are now stamped with a scene…