Unity-Technologies / com.unity.netcode.gameobjects

Netcode for GameObjects is a high-level netcode SDK that provides networking capabilities to GameObject/MonoBehaviour workflows within Unity and sits on top of underlying transport layer.
MIT License
2.15k stars 435 forks source link

NetworkEarlyUpdate causing game to lag significantly ON ANDROID #2934

Closed LightPat closed 3 months ago

LightPat commented 6 months ago

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

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 commented 6 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

LightPat commented 6 months ago

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

LightPat commented 4 months ago

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.

LightPat commented 4 months ago

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?

NoelStephensUnity commented 3 months ago

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

LightPat commented 3 months ago

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