NetListAsArray uses span instead of array now.

This commit is contained in:
Pieter-Jan Briers
2021-10-05 15:19:53 +02:00
parent 4b30a94126
commit 98593b7b33
9 changed files with 59 additions and 79 deletions

View File

@@ -412,64 +412,57 @@ namespace Robust.Client.GameStates
private List<EntityUid> ApplyGameState(GameState curState, GameState? nextState)
{
_config.TickProcessMessages();
_mapManager.ApplyGameStatePre(curState.MapData, curState.EntityStates.Array);
var createdEntities = ApplyEntityStates(curState.EntityStates.Array, curState.EntityDeletions.Array,
nextState?.EntityStates.Array);
_players.ApplyPlayerStates(curState.PlayerStates.Array);
_mapManager.ApplyGameStatePre(curState.MapData, curState.EntityStates.Span);
var createdEntities = ApplyEntityStates(curState.EntityStates.Span, curState.EntityDeletions.Span,
nextState != null ? nextState.EntityStates.Span : default);
_players.ApplyPlayerStates(curState.PlayerStates.Value ?? Array.Empty<PlayerState>());
_mapManager.ApplyGameStatePost(curState.MapData);
GameStateApplied?.Invoke(new GameStateAppliedArgs(curState));
return createdEntities;
}
private List<EntityUid> ApplyEntityStates(EntityState[]? curEntStates, IEnumerable<EntityUid>? deletions,
EntityState[]? nextEntStates)
private List<EntityUid> ApplyEntityStates(ReadOnlySpan<EntityState> curEntStates, ReadOnlySpan<EntityUid> deletions,
ReadOnlySpan<EntityState> nextEntStates)
{
var toApply = new Dictionary<IEntity, (EntityState?, EntityState?)>();
var toInitialize = new List<Entity>();
var created = new List<EntityUid>();
deletions ??= new EntityUid[0];
if (curEntStates != null && curEntStates.Length != 0)
foreach (var es in curEntStates)
{
foreach (var es in curEntStates)
//Known entities
if (_entities.TryGetEntity(es.Uid, out var entity))
{
//Known entities
if (_entities.TryGetEntity(es.Uid, out var entity))
// Logger.Debug($"[{IGameTiming.TickStampStatic}] MOD {es.Uid}");
toApply.Add(entity, (es, null));
}
else //Unknown entities
{
var metaState = (MetaDataComponentState?) es.ComponentChanges.Value?.FirstOrDefault(c => c.NetID == _metaCompNetId).State;
if (metaState == null)
{
// Logger.Debug($"[{IGameTiming.TickStampStatic}] MOD {es.Uid}");
toApply.Add(entity, (es, null));
}
else //Unknown entities
{
var metaState = (MetaDataComponentState?) es.ComponentChanges.Value?.FirstOrDefault(c => c.NetID == _metaCompNetId).State;
if (metaState == null)
{
throw new InvalidOperationException($"Server sent new entity state for {es.Uid} without metadata component!");
}
// Logger.Debug($"[{IGameTiming.TickStampStatic}] CREATE {es.Uid} {metaState.PrototypeId}");
var newEntity = (Entity)_entities.CreateEntity(metaState.PrototypeId, es.Uid);
toApply.Add(newEntity, (es, null));
toInitialize.Add(newEntity);
created.Add(newEntity.Uid);
throw new InvalidOperationException($"Server sent new entity state for {es.Uid} without metadata component!");
}
// Logger.Debug($"[{IGameTiming.TickStampStatic}] CREATE {es.Uid} {metaState.PrototypeId}");
var newEntity = (Entity)_entities.CreateEntity(metaState.PrototypeId, es.Uid);
toApply.Add(newEntity, (es, null));
toInitialize.Add(newEntity);
created.Add(newEntity.Uid);
}
}
if (nextEntStates != null && nextEntStates.Length != 0)
foreach (var es in nextEntStates)
{
foreach (var es in nextEntStates)
if (_entities.TryGetEntity(es.Uid, out var entity))
{
if (_entities.TryGetEntity(es.Uid, out var entity))
if (toApply.TryGetValue(entity, out var state))
{
if (toApply.TryGetValue(entity, out var state))
{
toApply[entity] = (state.Item1, es);
}
else
{
toApply[entity] = (null, es);
}
toApply[entity] = (state.Item1, es);
}
else
{
toApply[entity] = (null, es);
}
}
}
@@ -553,9 +546,9 @@ namespace Robust.Client.GameStates
var compStateWork = new Dictionary<ushort, (ComponentState? curState, ComponentState? nextState)>();
var entityUid = entity.Uid;
if (curState?.ComponentChanges.Array is { } changes)
if (curState != null)
{
foreach (var compChange in changes)
foreach (var compChange in curState.ComponentChanges.Span)
{
if (compChange.Deleted)
{
@@ -578,19 +571,16 @@ namespace Robust.Client.GameStates
compStateWork[compChange.NetID] = (compChange.State, null);
}
}
}
if (curState?.ComponentChanges.Array is { } changes2)
{
foreach (var compChange in changes2)
foreach (var compChange in curState.ComponentChanges.Span)
{
compStateWork[compChange.NetID] = (compChange.State, null);
}
}
if (nextState?.ComponentChanges.Array is { } nextChanges)
if (nextState != null)
{
foreach (var compState in nextChanges)
foreach (var compState in nextState.ComponentChanges.Span)
{
if (compStateWork.TryGetValue(compState.NetID, out var state))
{

View File

@@ -168,13 +168,13 @@ namespace Robust.Client.GameStates
}
else
{
foreach (var deletion in state.EntityDeletions.Array)
foreach (var deletion in state.EntityDeletions.Span)
{
_lastStateFullRep.Remove(deletion);
}
}
foreach (var entityState in state.EntityStates.Array)
foreach (var entityState in state.EntityStates.Span)
{
if (!_lastStateFullRep.TryGetValue(entityState.Uid, out var compData))
{
@@ -182,18 +182,15 @@ namespace Robust.Client.GameStates
_lastStateFullRep.Add(entityState.Uid, compData);
}
if (entityState.ComponentChanges.Array is { } changes)
foreach (var change in entityState.ComponentChanges.Span)
{
foreach (var change in changes)
if (change.Deleted)
{
if (change.Deleted)
{
compData.Remove(change.NetID);
}
else if (change.State is not null)
{
compData[change.NetID] = change.State;
}
compData.Remove(change.NetID);
}
else if (change.State is not null)
{
compData[change.NetID] = change.State;
}
}
}

View File

@@ -68,7 +68,7 @@ namespace Robust.Client.GameStates
if(gameState.EntityStates.HasContents)
{
// Loop over every entity that gets updated this state and record the traffic
foreach (var entityState in gameState.EntityStates.Array)
foreach (var entityState in gameState.EntityStates.Span)
{
var newEnt = true;
for(var i=0;i<_netEnts.Count;i++)

View File

@@ -82,14 +82,14 @@ namespace Robust.Client.GameStates
if (entStates.HasContents)
{
var sb = new StringBuilder();
foreach (var entState in entStates.Array)
foreach (var entState in entStates.Span)
{
if (entState.Uid == WatchEntId)
{
if(entState.ComponentChanges.Array is { } changes)
if(entState.ComponentChanges.HasContents)
{
sb.Append($"\n Changes:");
foreach (var compChange in changes)
foreach (var compChange in entState.ComponentChanges.Span)
{
var registration = _componentFactory.GetRegistration(compChange.NetID);
var create = compChange.Created ? 'C' : '\0';
@@ -110,7 +110,7 @@ namespace Robust.Client.GameStates
if (entDeletes.HasContents)
{
var sb = new StringBuilder();
foreach (var entDelete in entDeletes.Array)
foreach (var entDelete in entDeletes.Span)
{
if (entDelete == WatchEntId)
{

View File

@@ -11,7 +11,7 @@ namespace Robust.Client.Map
{
internal class ClientMapManager : MapManager, IClientMapManager
{
public void ApplyGameStatePre(GameStateMapData? data, EntityState[]? entityStates)
public void ApplyGameStatePre(GameStateMapData? data, ReadOnlySpan<EntityState> entityStates)
{
// There was no map data this tick, so nothing to do.
if(data == null)
@@ -20,7 +20,7 @@ namespace Robust.Client.Map
// First we need to figure out all the NEW MAPS.
if(data.CreatedMaps != null)
{
DebugTools.Assert(entityStates is not null, "Received new maps, but no entity state.");
DebugTools.Assert(!entityStates.IsEmpty, "Received new maps, but no entity state.");
foreach (var mapId in data.CreatedMaps)
{
@@ -33,11 +33,7 @@ namespace Robust.Client.Map
//get shared euid of map comp entity
foreach (var entityState in entityStates!)
{
var changes = entityState.ComponentChanges.Array;
if (changes is null)
continue;
foreach (var compChange in changes)
foreach (var compChange in entityState.ComponentChanges.Span)
{
if (compChange.State is not MapComponentState mapCompState || mapCompState.MapId != mapId)
continue;
@@ -69,11 +65,7 @@ namespace Robust.Client.Map
//get shared euid of map comp entity
foreach (var entityState in entityStates!)
{
var changes = entityState.ComponentChanges.Array;
if (changes is null)
continue;
foreach (var compState in changes)
foreach (var compState in entityState.ComponentChanges.Span)
{
if (compState.State is not MapGridComponentState gridCompState || gridCompState.GridIndex != gridId)
continue;

View File

@@ -1,3 +1,4 @@
using System;
using Robust.Shared.GameObjects;
using Robust.Shared.GameStates;
using Robust.Shared.Map;
@@ -8,7 +9,7 @@ namespace Robust.Client.Map
{
// Two methods here, so that new grids etc can be made BEFORE entities get states applied,
// but old ones can be deleted after.
void ApplyGameStatePre(GameStateMapData? data, EntityState[]? entityStates);
void ApplyGameStatePre(GameStateMapData? data, ReadOnlySpan<EntityState> entityStates);
void ApplyGameStatePost(GameStateMapData? data);
}
}

View File

@@ -24,7 +24,7 @@ namespace Robust.Client.Player
void Startup();
void Shutdown();
void ApplyPlayerStates(PlayerState[] list);
void ApplyPlayerStates(IReadOnlyCollection<PlayerState> list);
}
public class LocalPlayerChangedEventArgs : EventArgs

View File

@@ -103,9 +103,9 @@ namespace Robust.Client.Player
}
/// <inheritdoc />
public void ApplyPlayerStates(PlayerState[] list)
public void ApplyPlayerStates(IReadOnlyCollection<PlayerState> list)
{
if (list.Length == 0)
if (list.Count == 0)
{
// This happens when the server says "nothing changed!"
return;