Releases: needle-mirror/com.unity.netcode
Releases · needle-mirror/com.unity.netcode
1.6.2
[1.6.2] - 2025-07-07
Added
UnityEngine.Time.frameCountis appended to netcode packettimestamplogs using format:[Fr{0}].
Changed
- The client now sends - as part of its command data - some extra information regarding the command tick. In particular, it informs the server if the current command is for a full or partial update/tick. This ensure a more proper time-sync, and avoids mis-predictions.
Fixed
- Adding
GhostAuthoringComponentwill now work properly for a prefab that is opened (double clicked instead of just selected). - Issue preventing static-optimized, not pre-spawned ghosts from spawning on clients when their first serialization result was 'zero-change' against a baseline value of
default(T). They'd previously only be sent for the first time after changing. - Project Breaking Change: Regenerated the GUID for
Packages/com.unity.netcode/Tests/Editor/Physics/Unity.NetCode.Physics.Editor.Tests.asmdefso that it would no longer clash withPackages/com.havok.physics/Plugins/Android/Havok.Physics.Plugin.Android.asmdef. Any assemblies attempting to reference Unity.NetCode.Physics.Editor.Tests by GUIDd8342c4acf8f78e439367cff1a5e802fwill need to be changed tobec3f262d6e6466eb2c61661da550f47. - An issue - due to improper time syncing in between the client and server - especially when using IPC, causing multiple side effects:
- the client was typically only sending commands to the server for partial ticks, not full ticks, causing mis-predictions.
- the client was slightly behind the server, thus receiving new snapshots slightly in advance, and skipping running the
PredictedSimulationSystemGroupfor one frame or more, causing jittery and noticeable artefacts.
- Potential Behaviour Breaking Change: GhostInstance's GhostType is now set with the same valid value for both client and server prespawned instances. (Previously, this was always kept at an initial -1 value server side and never initialized). This way is now more consistent behaviour between client and server.
1.6.1
[1.6.1] - 2025-05-28
Added
- Two new entity command buffer systems that run at the beginning and end of the
PredictedSimulationSystemGrouprespectively:BeginPredictedSimulationCommandBufferSystemandEndPredictedSimulationCommandBufferSystem. - A new internal
PredictedSpawningSystemGroup, running after theEndPredictedSimulationCommandBufferSystem, created to guarantee that when a new snapshot is received from server, all new ghosts are spawned and ready to receive new data. - New documentation regarding the NetworkDriverStore architecture, setup and how to use it in conjunction with Unity.Relay.
- Experimental host migration feature added, enabled with the ENABLE_HOST_MIGRATION define but otherwise hidden.
- With ENABLE_HOST_MIGRATION defined, when a client reconnects to a server after disconnecting the connection entity on both sides will receive a
NetworkStreamIsReconnectedcomponent. An internal unique ID is added to connections to track this behaviour. - The ability to define a smaller
GhostSystemConstants.SnapshotHistorySizevalue via compiler defineNETCODE_SNAPSHOT_HISTORY_SIZE_6orNETCODE_SNAPSHOT_HISTORY_SIZE_16. These values are well suited for larger scale use-cases where server memory is constrained, and snapshot sends of individual ghosts are relatively infrequent. - Support for combining Ghost Relevancy with Ghost Importance Scaling via new
PrioChunks.isRelevantfield, enabling a fast-path for relevancy calculations. - Analytics to netcode tools to better understand their usage.
Changed
- Behaviour Breaking Change: Predicted spawned ghosts for partial ticks skip restoring the state from the backup (and instead continue prediction from their spawn state) when the last backup state tick is identical to the spawn tick, as no data has changed.
- Behaviour Breaking Change: Reduced the complexity (and performance overhead) of the
GhostCount.GhostCountOnServercalculations internally. Note that this value is (and always has been) an approximation. - IsReconnected split into NetworkStreamIsReconnected for reconnected connections and IsMigrated for re-spawned ghosts (Host Migration).
- Moved host migration related types into a
Unity.Netcode.HostMigrationnamespace, renamed theHostMigrationclass toHostMigrationUtilityso it works in the new namespace. - Prespawn ghost IDs will now be preserved between host migrations
- Client connection
NetworkIDsare now preserved between host migrations.
Fixed
- Behaviour Breaking Change: Incorrect state serialized inside the
SnapshotDataBufferfor predicted spawned ghost on the client when spawned inside the prediction loop. ThePredictedGhostSpawnSystemis now updated also as part of the prediction loop (inside thePredictedSpawningSystemGroup) to ensure that any predicted spawned ghosts on the client are correctly initialized at the tick they are spawned, and not with partial tick state. - Issue where predicted spawned ghosts re-simulated from the wrong tick when configured to rollback to their
spawnTickand are spawned inside the prediction loop. They are now restored using the corrected full tick state, rather than the erroneous partial tick state. - Enable creating and initializing server drivers when using WebGL to enable self-hosting cases using relay. Many methods were under conditional compilation flags and removed from the WebGL build and not usable outside the editor.
- All the unmanaged systems present in the FixedStepSimulationSystemGroup that have a direct or indirect update dependency to the PhysicsSystemGroup are now correctly moved to the PredictedFixedStepSimulationSystemGroup. This is a Behaviour Change in respect the previous versions, where all the unmanaged systems continued to stay inside the fixed update group, regardless of the dependency of update order.
- An issue with Mutiplayer PlayModeTool window, throwing exceptions when docked after a domain reload. The issue was due to because of an access to
EditorPrefsandApplication.productNamewhile restoring the window state. - Issue where, during host migration, ghosts could be migrated with a 0 id and type. Causing various issues when instantiated on the new host.
- Crash which could happen after host migrations when the server is deploying the host migration data.
- Issue with prespawn prefab entity list initialization after a host migration, the ordering of the prespawn ghosts could be shifted by one because of the internal
PrespawnSceneListentity prefab creation. This would result in invalid ghost type X (expected X+1) off by one style errors. - The prediction loop will no longer rollback too many times when one ghost is switched from predicted to interpolated, and later switched back to predicted, when that ghost is the only predicted ghost.
- If you update multiple packages, create a new section with a new header for the other package.
- The client packet dump was not being written to the
EnablePacketLogging.NetDebugPacketCachefield, thus were not usable by users and other netcode call-sites (like theNetworkStreamReceiveSystem). SnapshotHistorySizevalues below 32 uncovered an issue where a ghost chunk being written would write over its snapshot history entries for currently-in-flight snapshots, leading to a cycle of never being able to fetch a valid baseline, in perpetuity. The fix for this requires us to stall the send of this ghost chunk if the in-flight queue is full, until the in-flight snapshots are assumed to have either arrived or been lost/dropped.- Buffer serialization errors caused by incorrect pointer stepping when ghost fields are not present (i.e. surrounding
GhostComponentSerializer.State.HasGhostFields). - Buffer serialization errors caused by missing change mask invalidation when
SendToOwnerTypeorGhostSendTypeconditionally prevented sending of the buffer. - Readded
UsePreSerializationto theGhostAuthoringComponentinspector that was accidentally removed.
Obsolete
- Prefer
BatchScaleImportanceDelegatetoScaleImportanceFunctionas the latter significantly reduces the total number of function pointer calls.
1.5.1
[1.5.1] - 2025-05-06
Added
- Experimental host migration feature added, enabled with the ENABLE_HOST_MIGRATION define but otherwise hidden.
- With ENABLE_HOST_MIGRATION defined, when a client reconnects to a server after disconnecting the connection entity on both sides will receive a
NetworkStreamIsReconnectedcomponent. An internal unique ID is added to connections to track this behaviour.
Changed
- IsReconnected split into NetworkStreamIsReconnected for reconnected connections and IsMigrated for re-spawned ghosts (Host Migration).
Fixed
- An issue with Mutiplayer PlayModeTool window, throwing exceptions when docked after a domain reload. The issue was due to because of an access to
EditorPrefsandApplication.productNamewhile restoring the window state. - Issue where, during host migration, ghosts could be migrated with a 0 id and type. Causing various issues when instantiated on the new host.
- Crash which could happen after host migrations when the server is deploying the host migration data.
- Issue with prespawn prefab entity list initialization after a host migration, the ordering of the prespawn ghosts could be shifted by one because of the internal
PrespawnSceneListentity prefab creation. This would result in invalid ghost type X (expected X+1) off by one style errors.
1.4.1
[1.4.1] - 2025-04-30
Fixed
- "Size limitation on snapshot did not prevent all errors" and improper serialization of a ghost group root when the group is empty and the available space in the data stream is not enough to encode the length of the group (0, that takes 2 bits).
- Missing reset of the entity sent state when a group fail to serialize. The serialized children entity were incorrectly reported to be sent, potentially causing improper baseline used by the server to delta compress the data.
1.5.0
[1.5.0] - 2025-04-22
Added
- The
AutomaticThinClientWorldsUtilityclass, which facilitates runtime creation (and management) of thin clients. It is available to user-code, and when inPlayType.Server. ClientTickRate.NumAdditionalClientPredictedGhostLifetimeTicks, which can be used to fine-tune/alleviate a common issue where correctly predicted client predicted spawns are de-spawned by the netcode package before they have an opportunity to be classified against their server-side counterparts, which is a common occurrence when said spawns replicate later than expected (which can happen for a variety of reasons). The default behaviour is to have them despawn if they have not been classified by theNetworkTime.InterpolationTick. This value extends this threshold by this many additional ticks. However, if ghosts are frequently unable to replicate by theNetworkTime.InterpolationTick, then your interpolation buffer may be too small. I.e. Consider tweakingClientTickRate.InterpolationTimeMS(or theInterpolationTimeNetTicksequivalent) first. For further reading, refer to the interpolation docs here.- Exposed the
k_TickPeriodrange constant (defaulting to±5 ticks) in the default classification system asClientTickRate.DefaultClassificationAllowableTickPeriod. This may help fix esoteric default classification related errors, particularly when the server is frequently batching ticks (leading to large tick deltas). That said; prefer writing your own classification system, which can take advantage of project-specificGhostFielddata to more accurately classify predicted spawns. ClientServerBootstrap.AllNetCodeWorldsEnumeratorandClientServerBootstrap.AllClientWorldsEnumeratorhelpers.- Doc on gotcha with custom template serialization and byte alignment.
- Tests (and a packet dump entry & warning log) covering the case where clients are impacted by the unfathomably rare
MaxBaselineAgeedge-case. - FixedList replication support for RPC, Command, and components (IComponentData, IBufferElementData, IInputComponentData). Some limitation apply, see the doc for further info.
- unsafe fixed buffer replication support for RPC, Command, and components (IComponentData, IBufferElementData, IInputComponentData). Some limitation apply, see the doc for further info.
- GhostAuthoringComponent.UseSingleBaseline`, denoting that this prefab type should force 'single baseline' delta-compression during serialization, which can lead to significant CPU savings at the cost of marginally increased bandwidth consumption, particularly for ghosts with many components, and/or with many GhostField's which rarely change.
- new templates for serializing bytes and short using 8 and 16 bits instead of a full 32 bit data, when they are sent uncompressed.
- Static-optimized ghosts now report their
CanUseStaticOptimization(CUSO) status to the packet dump (including theComponentTypeof the first detected changed version), which should aid debugging efforts. - Broad packet dump data improvements, at the cost of worsened server performance when enabled.
- missing documentation in regards what are the fields types for which prediction errors are reported.
- Documentation and test coverage regarding the
GhostGroupfeature. - Test and doc coverage of
[GhostField]C# unions (via[StructLayout(LayoutKind.Explicit)]), which are supported (with many caveats). - Test coverage of
NetworkStreamSnapshotTargetSize, UTP'sMaxMessageSize, andGhostSystemConstants.MaxSnapshotSendAttempts.
Changed
- Behaviour Breaking Change: The client will now ignore the
HandshakeApprovalTimeoutMSuntil it has completed theHandshakephase, as it should respect this servers value, rather than assuming its own. Relatedly: Be aware that client worlds will not fetch theClientServerTickRatevalues from aNetCodeConfig.Globalconfig, they will only accept values sent to it by the server during handshake. - Behaviour Breaking Change: The
AddCommandDatamethod will now reject inputs withInvalidTick values, preventing runtime exceptions in rare cases. - Behaviour Breaking Change: The
DefaultDriverConstructorno longer removes the IPC driver whenRequestedPlayType == Server, as thin clients can now be instantiated on DGS builds (assuming supported by user-code). - Value Breaking Change: Increased the Lag Compensation Physics
CollisionWorldhistory buffer capacity from 16 ticks to 32 ticks, as the previous buffer was too small for some use-cases. However, the default value (when usingLagCompensationConfig.ServerHistorySize:0) remains at 16. Increasing this will allocate more collision worlds, increasing the memory consumption on theServerWorld, particularly with very large physics scenes, and therefore should only be done if you intend to support high-ping players (i.e. you're often seeingPhysicsWorldHistorySingleton.GetCollisionWorldFromTickclamp a clients history to the last/oldest stored value). Also note the change to the public constPhysicsWorldHistory.RawHistoryBufferMaxCapacity(from 16 to 32).
1.5.0-exp.101
[1.5.0-exp.101] - 2025-03-13
Fixed
- Fix broken link in the documentation.
1.5.0-exp.100
[1.5.0-exp.100] - 2025-03-11
Changed
- Big documentation overhaul for host migration feature.
- Don't add input component buffers to host migration data. These can cause issues after host migration when they have inputs event counters set to some value where the migrated clients will be start counts starting from 0. The increment/decrement mechanism breaks.
- Ghost IDs and spawn ticks in the
GhostInstancecomponent will now be preserved for non-prespawn ghosts between host migrations.
Fixed
- UpdateSize in the
HostMigrationStatscomponent is now correct when using compression - Issue with the native list size being incorrectly re-sized in
HostMigration.GetHostMigrationData - Test failures when packet dumps are enabled
- Issue where old prespawn snapshot data would still exist for clients after a host migration causing deserialization errors.
1.5.0-exp.2
[1.5.0-exp.2] - 2025-02-10
Changed
- Added more sections to the documentation with information about what to look out for during a host migration.
- Renamed
HostMigration.MigrateServerDatatoHostMigration.SetHostMigrationDataand made it public. It's the counterpart toGetHostMigrationData.MigrateDataToNewServerWorldis now optional to use. - Added a world parameter to the public APIs
GetHostMigrationData/TryGetHostMigrationData.
Fixed
- Issue where the relay connection setup would fail after host migrations. Stopped using fixed listening ports on the server.
- Issue with incorrect host migration size being uploaded. When the host migration data blob was small it would cause errors during deployment.
- Issue when the host configuration part of the migration data was over 1KB in size.
1.5.0-exp.1
[1.5.0-exp.1] - 2025-01-28
Added
- The
AutomaticThinClientWorldsUtilityclass, which facilitates runtime creation (and management) of thin clients. It is available to user-code, and when inPlayType.Server. ClientTickRate.NumAdditionalClientPredictedGhostLifetimeTicks, which can be used to tune down a common issue where (correctly predicted) client predicted spawns are despawned by the netcode package before they can be classified against their server-side counterparts (i.e. which may arrive shortly after).- Exposed the implicit
k_TickPeriodrange constant (defaulting to±5 ticks) in the default classification system asClientTickRate.DefaultClassificationAllowableTickPeriod. This may help fix esoteric default classification related errors, particularly when the server is frequently batching ticks (leading to large tick deltas). Prefer writing your own classification system, though, which can take advantage of project-specific GhostField data. - Host migration feature for simple projects. APIs are provided to save the current server world state, mostly related to current ghosts (
HostMigration.GetHostMigrationData) and then to deploy a given server state data blob to a new server world (HostMigration.MigrateDataToNewServerWorld). This can be used with the Unity Lobby service to better facilitate host migrations with session persistence. See Host Migration section in the manual for more information.
Changed
- Behaviour Breaking Change: The client will now ignore the
HandshakeApprovalTimeoutMSuntil it has completed theHandshakephase, as it should respect this servers value, rather than assuming its own. Relatedly: Be aware that client worlds will not fetch theClientServerTickRatevalues from aNetCodeConfig.Globalconfig, they will only accept values sent to it by the server during handshake. - Behaviour Breaking Change: The
AddCommandDatamethod will now reject inputs withInvalidTick values, preventing runtime exceptions in rare cases. - Behaviour Breaking Change: The
DefaultDriverConstructorno longer removes the IPC driver whenRequestedPlayType == Server, as thin clients can now be instantiated on DGS builds (assuming supported by user-code). - Value Breaking Change: Increased the Lag Compensation Physics
CollisionWorldhistory buffer capacity from 16 ticks to 32 ticks, as the previous buffer was too small for some use-cases. However, the default value (when usingLagCompensationConfig.ServerHistorySize:0) remains at 16. Increasing this will allocate more collision worlds, increasing the memory consumption on theServerWorld, particularly with very large physics scenes, and therefore should only be done if you intend to support high-ping players (i.e. you're often seeingPhysicsWorldHistorySingleton.GetCollisionWorldFromTickclamp a clients history to the last/oldest stored value). Also note the change to the public constPhysicsWorldHistory.RawHistoryBufferMaxCapacity(from 16 to 32).
Fixed
- Issue where disconnecting while in the process of spawning prefabs raised the following error: "Found a ghost in the ghost map which does not have an entity connected to it. This can happen if you delete ghost entities on the client."
- Overzealous RPC validation error when broadcasting an RPC on the same frame as a disconnection.
- The
AutomaticThinClientWorldsUtilitynow allows you to disable automatic in-editor thin client creation by settingBootstrapInitializationandRuntimeInitializationto null during bootstrapping. - Removed the limitation preventing thin clients from being created when in mode
Server, including DGS builds. Ensure thin client systems are in assemblies that will be loaded on the server. - Bug causing user-created thin client worlds to be automatically cleaned up by the netcode package due to
RequestedNumThinClients. Now, only worlds which are created via theAutomaticThinClientWorldsUtility(or manually added by user-code to its tracking list) will be automatically disposed. - Inconsistencies in documentation around RollbackPredictionOnStructuralChanges have been fixed and sorted out a couple of typos.
- Issue with prespawned ghosts not updating anymore after the client disconnects and reconnects to a server.
1.4.0
[1.4.0] - 2024-11-14
Added
- A togglable warning to display when the server is batching ticks.
- PhysicGroupRunMode property to the NetcodePhysicsConfigAuthoring to let the user configure when the predicted physics loop should run.
- PredictionLoopUpdateMode property to the ClientTickRate to let the user configure when the PredictionSimulationSystemGroup should update. In particular, it is allow now to have the prediction loop running all the time, regardless of the presence of predicted ghost.
GhostSendSystemData.MaxIterateChunks, which denotes the maximum number of chunks theGhostSendSystemwill iterate over in a single tick, for a given connection, within a singleNetworkTickRatesnapshot send interval. It's an optimization in use-cases where you have many thousands of static ghosts (and thus hundreds of static chunks which are iterated over unnecessarily to find ones containing possible changes), but can lead to empty snapshots if set too low. Pairs well withMaxSendChunks, and defaults to 0 (OFF) to avoid a behaviour change.- Many Unity Transport Package
NetworkConfigParametershave been added to theNetCodeConfig. They are ignored if using a custom driver, unless said driver calls the new static methodDefaultDriverBuilder.AddNetcodePackageNetworkConfigParameters. ClientServerTickRate.SnapshotAckMaskCapacityconfigures the length of the ack mask history (inServerTicks). It is used by the snapshot system to determine whether or not a ghost has an acked baseline snapshot, and only queried when said chunk is attempting to be resent. Its new default (of 4096, up from 256) supports ~1.1 minutes (up from ~4.26 seconds) under default settings (i.e. assuming aSimulationTickRateof 60Hz). Increasing this value further can protect against the aforementioned snapshot acking errors when sending tens of thousands of ghosts to an individual client connection.GhostAuthoringComponent.MaxSendRate, which denotes the maximum possible send frequency (in Hz) for ghost chunks of this ghost prefab type. Note, however, that other factors (likeNetworkTickRate, ghost instance count, the use of Static-Optimization vs Dynamic,Importance, Importance-Scaling,DefaultSnapshotPacketSizeetc.) will determine the final send rate. UseMaxSendRateto brute-force reduce the bandwidth consumption of your most impactful ghost types.GhostCountInstantiatedOnClientandGhostCountReceivedOnClientto theGhostCountstruct to differentiate ghosts which we have only received the data for, from fully instantiated ghosts (i.e. ghosts with entities). See deprecation entry andPendingSpawnPlaceholder.- The
AutomaticThinClientWorldsUtilityclass, which facilitates runtime creation (and management) of thin clients. It is available to user-code, and when inPlayType.Server.
Changed
- The error for
NetworkProtocolVersionmismatches will now better indicate what exactly went wrong, and what steps can be taken to resolve the error. - Incremental UI improvement to the
MultiplayerPlayModeWindownetcode worlds display. The server now lists ghost counts (details in tooltip), the clientGhostCountsingleton is now available via hovering over the ping tooltip (as it's often something you want to know), and theDriverStoredrivers are now displayed consistently. - Re-enabled disabled LoadScenes_AllScenesShouldConnect and LoadScenes_NoScenesShouldLog tests randomly failing that were failing because of the CommandSendSystemGroup issue.
- Behaviour Breaking Change:
GhostSendSystemData.MaxSendChunksno longer limits the max number of chunks to iterate over (i.e. query) - unlessGhostSendSystemData.MaxIterateChunksis zero - as it no longer counts cancelled chunk snapshot writes towards its total. Therefore, useGhostSendSystemData.MaxIterateChunksinstead to denote that limit. This should lead to fewer emptier packets, particularly when used in conjunction with many static and irrelevant ghosts. - API & Behaviour Breaking Change: The netcode package
DefaultDriverConstructorwill now default to the transportsNetworkParameterConstants.SendQueueCapacityandReceiveQueueCapacityrespectively (each512), rather than our own package implementation ofmax(playerCount * 4, 64)whereplayerCountis an optional parameter defaulting to 0. This optional parameter has since been removed fromCreateServerNetworkDriverandGetNetworkServerSettings, but you can instead override them via theNetCodeConfigadditions (see entry). This prevents the common fatal error case when playtesting with higher player counts, and removes the most common need for a per-projectINetworkStreamDriverConstructor, but is a small regression in memory consumption (~1.8MB) on both the client and the server, when using any built-inINetworkStreamDriverConstructor. We recommend configuring them back to 64 if that previously did not cause any issues. - The verbose "Delta time was negative. To avoid undefined behaviour the frame is skipped." log has been moved behind
NetDebug.DebugLogand re-worded. - Merged the two internal batched and unbatched
GatherGhostChunksmethods. Performance characteristics of both should be practically identical. - Placeholder ghosts are now given the name
GHOST-PLACEHOLDER-{ghostType}to aid in debugging. - Copy editing and improvements to the Setting up client and server worlds section of the documentation.
- Behaviour Breaking Change: The client will now ignore the
HandshakeApprovalTimeoutMSuntil it has completed theHandshakephase, as it should respect this servers value, rather than assuming its own. Relatedly: Be aware that client worlds will not fetch theClientServerTickRatevalues from aNetCodeConfig.Globalconfig, they will only accept values sent to it by the server during handshake. - Behaviour Breaking Change: The
AddCommandDatamethod will now reject inputs withInvalidTick values, preventing runtime exceptions in rare cases. - Behaviour Breaking Change: The
DefaultDriverConstructorno longer removes the IPC driver whenRequestedPlayType == Server, as thin clients can now be instantiated on DGS builds (assuming supported by user-code).
Deprecated
NetworkDriverInstance.simulatorEnabledsetter, as writing to it did not effectively enable and disable the simulator.- Behaviour Breaking Change:
GhostSendSystemData.MaxSendEntitiesno longer functions, as it was somewhat misleading, and less precise thanMaxSendChunksandMaxIterateChunks. - Renamed
GetNetworkSettingstoGetNetworkClientSettings. GhostCount.GhostCountOnClienthas been deprecated as it is ambiguous: Its value is the same as the newGhostCountReceivedOnClient, but its tooltip incorrectly implied that it was theGhostCountInstantiatedOnClient.
Fixed
MultiplayerPlayModeWindowissue where the width of the server world buttons were erroneously causing a Horizontal Scrollbar. Also removed slightly excessive repainting.- Limitation preventing the
MultiplayerPlayModeWindowfrom being resized when undocked. - CommandSendSystemGroup running systems when the current server tick is invalid, CommandSendPacketSystem (and other system potentially) throwing exceptions.
- an issue when using physics interpolation, causing graphical jitter on the replicated ghost when the physics system run on partial ticks.
- It is possible now to allow physics to run in the prediction loop even in case no predicted ghosts are present. This can be achieved by combining the PredictionLoopUpdateMode and PhysicGroupRunMode options.
- an issue with netcode source generated files, causing multiple Burst.CompileAsync invocation, ending up in stalling the editor and the player for long time, and / or causing crashes.
- Critical
GhostSendSystemandGhostChunkSerializerissue preventing ghosts from successfully acking their own previous snapshots, in cases where the next attempted resend of a ghost chunk exceeded 256 ticks (easily encountered when attempting to replicate thousands of ghosts to a single connection). Whenever a ghost chunk is unable to ack, larger deltas must be resent, and static optimization early-outing logic cannot be applied, causing unnecessary bandwidth and CPU consumption. While this issue did tend to stabilize over time, our initial fix is to increase this ack window considerably (seeClientServerTickRate.SnapshotAckMaskCapacityentry). - Prevented the
GhostAuthoringInspectionComponentfrom erroneously re-baking the ghost while the user is editing a property on said ghost prefab (applicable only when in 'Auto-Refresh' mode). MinSendImportanceno longer artificially delays the initial send of ghosts with low importance values (although this was mitigatable viaFirstSendImportanceMultiplier).- Issue with ElapsedTime in server worlds where it could fall behind compared to InitializationSystemGroup's if the frame's deltaTime was going over MaxSimulationStepsPerFrame * MaxSimulationStepBatchSize settings. This changes the catch up behaviour server side. Previously, the server would skip ticks if batching wasn't enough while now it'll do its best to catchup on those missing ticks on the subsequent frames if time allows.
- Issue where Netcode's ElapsedTime could be ahead of the InitializationSystemGroup elapsed time in server worlds. It should now either always be equal to or slightly behind if not enough time has accumulated for a tick to execute.
- Issue where disconnecting while in the process of spawning prefabs raised the following error: "Found a ghost in the ghost map which does not have an entity connected to it. This can happen if you delete ghost entities on the client."
- Overzealous RPC validation error when broadcasting an RPC on the same frame as a disconnection.
- The
AutomaticThinClientWorldsUtilitynow allows you to disable automatic in-editor thin client creation by setting `Boot...