Closed LightPat closed 3 months ago
After further analysis, it appears that my lag is coming from too many client RPC calls. When I have 8 players or so, each time they play an attack (which happens pretty frequently it's a hack and slash game), it adds to the message queue. I can have all the players connected, and if I disable the attacking RPCs, my FPS is stable, and network early update no longer takes up 30% of frame time (0-3%). I debugged that the RPCs aren't getting sent every frame, so I'm confused as to why this is happening still
Also, this problem occurs whether using the new [Rpc] attribute or the legacy [ServerRpc] and [ClientRpc] attributes
Updating this issue as I have progressed in development in our game
When we are the host:
When we are a client connected to a remote server:
It appears that this frame time is simply caused by NetworkVariable updates and RPC calls. When I'm just moving through the world my frame rate is stable with no issues. The frame drops only occur when other players that are connected perform actions.
Frame drops also occur on the client whenever an RPC is sent from a client to the server. I would attach my profiler data (deep profiling), but that's many GBs of data
This was tested with 1 remote player owned by the client and 3 player bots that were owned by the server in both cases.
After switching our scripts to mainly use network variables instead of RPC calls wherever possible, performance is better, however it's still not ideal. I attached a picture of the profiler when in a game with 8 players connected. Notice how many calls to TrackNetworkVariableDeltaRecieved there are, as well as other functions. I was told that updating networkvariables in the update() function is totally okay, and that the changes would be collected on the next tick. Could it be that I'm assigning values too often?
@LightPat
The TrackNetworkVariableDeltaReceived
method is indeed slow and is part of the multiplayer tools network metrics (i.e. NetworkMetrics
) which if you are testing performance you would definitely want to remove that prior to compiling for Android.
Could you try removing the Multiplayer Tools package, make a build for Android, and then see if your Android performance improves any?
As a side note, NGO v2.0.0 has the ability to disable these metrics within the NetworkManager
inspector view... unfortunately v1.x does not... but you can remove the package, build, and test it that way. I think you will see an improvement in your Android performance doing this.
Let me know if this solves this issue?
Oh god you're a lifesaver! This combined with a network prefab object pooling implementation will make our game run super smooth on android
Description
NetworkEarlyUpdate taking WAY too long in profiler.
This happens every 3-5 frames in my game, ONLY ON ANDROID. To be clear, I'm not assigning values to a FixedString network variable frequently anywhere in my code. Yet, this network message is taking up so much frame time so frequently (25-35%). I think this might be related to #2920 , as my project was suffering from that bug too. On 1.8.1, I also have this problem.
Environment
Additional Context
This is the code for my NetworkString struct I'm using now, since FixedString doesn't work on its own. See issue #2920