@@ -258,13 +258,21 @@ internal void NetworkedVarInit()
258
258
channelMappedVarIndexes [ firstLevelIndex [ channel ] ] . Add ( i ) ;
259
259
}
260
260
}
261
-
261
+
262
+ private readonly List < int > networkedVarIndexesToReset = new List < int > ( ) ;
263
+ private readonly HashSet < int > networkedVarIndexesToResetSet = new HashSet < int > ( ) ;
262
264
internal void NetworkedVarUpdate ( )
263
265
{
264
266
if ( ! networkedVarInit )
265
267
NetworkedVarInit ( ) ;
266
268
//TODO: Do this efficiently.
267
269
270
+ if ( ! CouldHaveDirtyVars ( ) )
271
+ return ;
272
+
273
+ networkedVarIndexesToReset . Clear ( ) ;
274
+ networkedVarIndexesToResetSet . Clear ( ) ;
275
+
268
276
for ( int i = 0 ; i < NetworkingManager . singleton . ConnectedClientsList . Count ; i ++ )
269
277
{
270
278
//This iterates over every "channel group".
@@ -278,6 +286,7 @@ internal void NetworkedVarUpdate()
278
286
writer . WriteUInt16Packed ( networkedObject . GetOrderIndex ( this ) ) ;
279
287
280
288
uint clientId = NetworkingManager . singleton . ConnectedClientsList [ i ] . ClientId ;
289
+ bool writtenAny = false ;
281
290
for ( int k = 0 ; k < networkedVarFields . Count ; k ++ )
282
291
{
283
292
if ( ! channelMappedVarIndexes [ j ] . Contains ( k ) )
@@ -291,19 +300,42 @@ internal void NetworkedVarUpdate()
291
300
writer . WriteBool ( isDirty ) ;
292
301
if ( isDirty && ( ! isServer || networkedVarFields [ k ] . CanClientRead ( clientId ) ) )
293
302
{
303
+ writtenAny = true ;
294
304
networkedVarFields [ k ] . WriteDelta ( stream ) ;
295
- networkedVarFields [ k ] . ResetDirty ( ) ;
305
+ if ( ! networkedVarIndexesToResetSet . Contains ( k ) )
306
+ {
307
+ networkedVarIndexesToResetSet . Add ( k ) ;
308
+ networkedVarIndexesToReset . Add ( k ) ;
309
+ }
296
310
}
297
311
}
298
312
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
+ }
303
320
}
304
321
}
305
322
}
306
323
}
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 ;
307
339
}
308
340
309
341
internal void HandleNetworkedVarDeltas ( Stream stream , uint clientId )
0 commit comments