@@ -258,13 +258,21 @@ internal void NetworkedVarInit()
258258 channelMappedVarIndexes [ firstLevelIndex [ channel ] ] . Add ( i ) ;
259259 }
260260 }
261-
261+
262+ private readonly List < int > networkedVarIndexesToReset = new List < int > ( ) ;
263+ private readonly HashSet < int > networkedVarIndexesToResetSet = new HashSet < int > ( ) ;
262264 internal void NetworkedVarUpdate ( )
263265 {
264266 if ( ! networkedVarInit )
265267 NetworkedVarInit ( ) ;
266268 //TODO: Do this efficiently.
267269
270+ if ( ! CouldHaveDirtyVars ( ) )
271+ return ;
272+
273+ networkedVarIndexesToReset . Clear ( ) ;
274+ networkedVarIndexesToResetSet . Clear ( ) ;
275+
268276 for ( int i = 0 ; i < NetworkingManager . singleton . ConnectedClientsList . Count ; i ++ )
269277 {
270278 //This iterates over every "channel group".
@@ -278,6 +286,7 @@ internal void NetworkedVarUpdate()
278286 writer . WriteUInt16Packed ( networkedObject . GetOrderIndex ( this ) ) ;
279287
280288 uint clientId = NetworkingManager . singleton . ConnectedClientsList [ i ] . ClientId ;
289+ bool writtenAny = false ;
281290 for ( int k = 0 ; k < networkedVarFields . Count ; k ++ )
282291 {
283292 if ( ! channelMappedVarIndexes [ j ] . Contains ( k ) )
@@ -291,19 +300,42 @@ internal void NetworkedVarUpdate()
291300 writer . WriteBool ( isDirty ) ;
292301 if ( isDirty && ( ! isServer || networkedVarFields [ k ] . CanClientRead ( clientId ) ) )
293302 {
303+ writtenAny = true ;
294304 networkedVarFields [ k ] . WriteDelta ( stream ) ;
295- networkedVarFields [ k ] . ResetDirty ( ) ;
305+ if ( ! networkedVarIndexesToResetSet . Contains ( k ) )
306+ {
307+ networkedVarIndexesToResetSet . Add ( k ) ;
308+ networkedVarIndexesToReset . Add ( k ) ;
309+ }
296310 }
297311 }
298312
299- if ( isServer )
300- InternalMessageHandler . Send ( clientId , MLAPIConstants . MLAPI_NETWORKED_VAR_DELTA , channelsForVarGroups [ j ] , stream ) ;
301- else
302- InternalMessageHandler . Send ( NetworkingManager . singleton . ServerClientId , MLAPIConstants . MLAPI_NETWORKED_VAR_DELTA , channelsForVarGroups [ j ] , stream ) ;
313+ if ( writtenAny )
314+ {
315+ if ( isServer )
316+ InternalMessageHandler . Send ( clientId , MLAPIConstants . MLAPI_NETWORKED_VAR_DELTA , channelsForVarGroups [ j ] , stream ) ;
317+ else
318+ InternalMessageHandler . Send ( NetworkingManager . singleton . ServerClientId , MLAPIConstants . MLAPI_NETWORKED_VAR_DELTA , channelsForVarGroups [ j ] , stream ) ;
319+ }
303320 }
304321 }
305322 }
306323 }
324+
325+ for ( int i = 0 ; i < networkedVarIndexesToReset . Count ; i ++ )
326+ {
327+ networkedVarFields [ networkedVarIndexesToReset [ i ] ] . ResetDirty ( ) ;
328+ }
329+ }
330+
331+ private bool CouldHaveDirtyVars ( )
332+ {
333+ for ( int i = 0 ; i < networkedVarFields . Count ; i ++ )
334+ {
335+ if ( networkedVarFields [ i ] . IsDirty ( ) )
336+ return true ;
337+ }
338+ return false ;
307339 }
308340
309341 internal void HandleNetworkedVarDeltas ( Stream stream , uint clientId )
0 commit comments