com.unity.netcode.gameobjects icon indicating copy to clipboard operation
com.unity.netcode.gameobjects copied to clipboard

NetworkEarlyUpdate causing game to lag significantly ON ANDROID

Open LightPat opened this issue 1 year ago • 2 comments

Description

NetworkEarlyUpdate taking WAY too long in profiler.

image

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

  • OS: Windows 10
  • Unity Version: 2021.3.38f1
  • Netcode Version: 1.9.1, 1.8.1

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 image

LightPat avatar May 23 '24 02:05 LightPat

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

LightPat avatar May 25 '24 02:05 LightPat

Also, this problem occurs whether using the new [Rpc] attribute or the legacy [ServerRpc] and [ClientRpc] attributes

LightPat avatar May 25 '24 02:05 LightPat

Updating this issue as I have progressed in development in our game

When we are the host:

  • NetworkPreUpdate takes 15-20% of frame time (14-20 avg ms).
  • Most of the usage in NetworkPreUpdate comes from NetworkBehaviour.NetworkBehaviourUpdate/NetworkBehaviour.VariableUpdate()
  • NetworkEarlyUpdate takes 0% of frame time (0.05 avg ms).

When we are a client connected to a remote server:

  • NetworkPreUpdate takes 10-15% of frame time (every 1-3 frames, whenever a tick is processed) (48-60 avg ms)
  • NetworkEarlyUpdate takes 30-45% of frame time (170 avg ms).

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.

LightPat avatar Jul 08 '24 20:07 LightPat

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. image image 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 avatar Jul 12 '24 14:07 LightPat

@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?

NoelStephensUnity avatar Aug 06 '24 23:08 NoelStephensUnity

Oh god you're a lifesaver! This combined with a network prefab object pooling implementation will make our game run super smooth on android

LightPat avatar Aug 07 '24 04:08 LightPat