Remove Entity Transform/MetaData Component Cache (#2296)

Co-authored-by: Vera Aguilera Puerto <gradientvera@outlook.com>
This commit is contained in:
Acruid
2021-12-03 01:33:06 -08:00
committed by GitHub
parent 6515b08b41
commit f8bebee904
7 changed files with 48 additions and 28 deletions

View File

@@ -247,7 +247,7 @@ namespace Robust.Client.GameObjects
internal static RenderingTreeComponent? GetRenderTree(IEntity entity)
{
if (entity.Transform.MapID == MapId.Nullspace ||
if (entity.Deleted || entity.Transform.MapID == MapId.Nullspace ||
entity.HasComponent<RenderingTreeComponent>()) return null;
var parent = entity.Transform.Parent?.Owner;
@@ -265,7 +265,7 @@ namespace Robust.Client.GameObjects
private bool IsVisible(SpriteComponent component)
{
return component.Visible && !component.ContainerOccluded;
return component.Visible && !component.ContainerOccluded && !component.Deleted;
}
public override void FrameUpdate(float frameTime)
@@ -312,7 +312,7 @@ namespace Robust.Client.GameObjects
{
light.TreeUpdateQueued = false;
if (!light.Enabled || light.ContainerOccluded)
if (light.Deleted || !light.Enabled || light.ContainerOccluded)
{
ClearLight(light);
continue;

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Robust.Shared.IoC;
using Robust.Shared.Network;
using Robust.Shared.Physics;
using Robust.Shared.Prototypes;
@@ -17,7 +18,7 @@ namespace Robust.Shared.GameObjects
#region Members
/// <inheritdoc />
public IEntityManager EntityManager { get; }
public IEntityManager EntityManager => IoCManager.Resolve<IEntityManager>();
/// <inheritdoc />
[ViewVariables]
@@ -26,7 +27,17 @@ namespace Robust.Shared.GameObjects
/// <inheritdoc />
EntityLifeStage IEntity.LifeStage { get => LifeStage; set => LifeStage = value; }
public EntityLifeStage LifeStage { get => MetaData.EntityLifeStage; internal set => MetaData.EntityLifeStage = value; }
public EntityLifeStage LifeStage
{
get
{
if (!EntityManager.EntityExists(Uid))
return EntityLifeStage.Deleted;
return MetaData.EntityLifeStage;
}
internal set => MetaData.EntityLifeStage = value;
}
[ViewVariables]
GameTick IEntity.LastModifiedTick { get => MetaData.EntityLastModifiedTick; set => MetaData.EntityLastModifiedTick = value; }
@@ -66,22 +77,26 @@ namespace Robust.Shared.GameObjects
public bool Deleted => LifeStage >= EntityLifeStage.Deleted;
[ViewVariables]
public bool Paused { get => MetaData.EntityPaused; set => MetaData.EntityPaused = value; }
private TransformComponent? _transform;
public bool Paused { get => Deleted || MetaData.EntityPaused; set => MetaData.EntityPaused = value; }
/// <inheritdoc />
[ViewVariables]
public TransformComponent Transform => _transform ??= GetComponent<TransformComponent>();
private MetaDataComponent? _metaData;
public TransformComponent Transform
{
get
{
return (TransformComponent)IoCManager.Resolve<IEntityManager>().GetComponent(Uid, typeof(TransformComponent));
}
}
/// <inheritdoc />
[ViewVariables]
public MetaDataComponent MetaData
{
get => _metaData ??= GetComponent<MetaDataComponent>();
internal set => _metaData = value;
get
{
return (MetaDataComponent)IoCManager.Resolve<IEntityManager>().GetComponent(Uid, typeof(MetaDataComponent));
}
}
#endregion Members
@@ -90,7 +105,6 @@ namespace Robust.Shared.GameObjects
public Entity(IEntityManager entityManager, EntityUid uid)
{
EntityManager = entityManager;
Uid = uid;
}

View File

@@ -293,10 +293,10 @@ namespace Robust.Shared.GameObjects
if(entity.Deleted) //TODO: Why was this still a child if it was already deleted?
return;
var uid = entity.Uid;
var transform = entity.Transform;
var metadata = entity.MetaData;
entity.LifeStage = EntityLifeStage.Terminating;
EventBus.RaiseLocalEvent(entity.Uid, new EntityTerminatingEvent(), false);
// DeleteEntity modifies our _children collection, we must cache the collection to iterate properly
@@ -306,8 +306,12 @@ namespace Robust.Shared.GameObjects
RecursiveDeleteEntity(childTransform.Owner);
}
// Dispose all my components, in a safe order so transform is available
DisposeComponents(entity.Uid);
// Shut down all components.
foreach (var component in InSafeOrder(_entCompIndex[uid]))
{
if(component.Running)
component.LifeShutdown();
}
// map does not have a parent node, everything else needs to be detached
if (transform.ParentUid != EntityUid.Invalid)
@@ -316,6 +320,9 @@ namespace Robust.Shared.GameObjects
transform.DetachParentToNull();
}
// Dispose all my components, in a safe order so transform is available
DisposeComponents(entity.Uid);
metadata.EntityLifeStage = EntityLifeStage.Deleted;
EntityDeleted?.Invoke(this, entity.Uid);
EventBus.RaiseEvent(EventSource.Local, new EntityDeletedMessage(entity));
@@ -343,7 +350,7 @@ namespace Robust.Shared.GameObjects
public bool EntityExists(EntityUid uid)
{
return TryGetEntity(uid, out _);
return _entTraitDict[typeof(MetaDataComponent)].ContainsKey(uid);
}
/// <summary>
@@ -402,7 +409,6 @@ namespace Robust.Shared.GameObjects
// Create the MetaDataComponent and set it directly on the Entity to avoid a stack overflow in DEBUG.
var metadata = new MetaDataComponent() { Owner = entity };
entity.MetaData = metadata;
// add the required MetaDataComponent directly.
AddComponentInternal(uid.Value, metadata);

View File

@@ -72,7 +72,7 @@ namespace Robust.Shared.GameObjects
{
var entity = component.Owner;
if (entity.Transform.MapID == MapId.Nullspace) return null;
if (entity.Deleted || entity.Transform.MapID == MapId.Nullspace) return null;
var parent = entity.Transform.Parent?.Owner;

View File

@@ -641,6 +641,9 @@ namespace Robust.Shared.Physics
private void AddToMoveBuffer(MapId mapId, FixtureProxy proxy, Box2 aabb)
{
if(mapId == MapId.Nullspace)
return;
_moveBuffer[mapId][proxy] = aabb;
}

View File

@@ -153,7 +153,7 @@ namespace Robust.UnitTesting.Server.GameObjects.Components
Assert.That(entityItem.Transform.Parent!.Owner, Is.EqualTo(entityOne));
entityOne.Delete();
Assert.That(entityTwo.Transform.Deleted, Is.True);
Assert.That(entityTwo.Deleted, Is.True);
}
[Test]

View File

@@ -254,14 +254,11 @@ namespace Robust.UnitTesting.Shared.Map
mapEnt.Delete();
// These shouldn't be valid anymore.
Assert.That(newEnt.Transform.Coordinates.IsValid(entityManager), Is.False);
Assert.That(gridEnt.Transform.Coordinates.IsValid(entityManager), Is.False);
Assert.That(newEnt.Deleted, Is.True);
Assert.That(gridEnt.Deleted, Is.True);
Assert.That(newEnt.Transform.Coordinates.TryGetEntity(entityManager, out newEntParent), Is.EqualTo(false));
Assert.That(newEntParent, Is.Null);
Assert.That(gridEnt.Transform.Coordinates.TryGetEntity(entityManager, out gridEntParent), Is.EqualTo(false));
Assert.That(gridEntParent, Is.Null);
Assert.That(newEntParent!.Deleted, Is.True);
Assert.That(gridEntParent!.Deleted, Is.True);
}
[Test]