Various improvements for network objects despawning
This commit is contained in:
@@ -165,6 +165,7 @@ namespace
|
|||||||
#if !COMPILE_WITHOUT_CSHARP
|
#if !COMPILE_WITHOUT_CSHARP
|
||||||
Dictionary<StringAnsiView, StringAnsi*> CSharpCachedNames;
|
Dictionary<StringAnsiView, StringAnsi*> CSharpCachedNames;
|
||||||
#endif
|
#endif
|
||||||
|
Array<Guid> DespawnedObjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
class NetworkReplicationService : public EngineService
|
class NetworkReplicationService : public EngineService
|
||||||
@@ -232,9 +233,12 @@ NetworkReplicatedObject* ResolveObject(Guid objectId, Guid parentId, char object
|
|||||||
obj->GetTypeHandle() == objectType &&
|
obj->GetTypeHandle() == objectType &&
|
||||||
!IdsRemappingTable.ContainsValue(item.ObjectId))
|
!IdsRemappingTable.ContainsValue(item.ObjectId))
|
||||||
{
|
{
|
||||||
// Boost future lookups by using indirection
|
if (NetworkManager::IsClient())
|
||||||
NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Remap object ID={} into object {}:{}", objectId, item.ToString(), obj->GetType().ToString());
|
{
|
||||||
IdsRemappingTable.Add(objectId, item.ObjectId);
|
// Boost future lookups by using indirection
|
||||||
|
NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Remap object ID={} into object {}:{}", objectId, item.ToString(), obj->GetType().ToString());
|
||||||
|
IdsRemappingTable.Add(objectId, item.ObjectId);
|
||||||
|
}
|
||||||
|
|
||||||
return &item;
|
return &item;
|
||||||
}
|
}
|
||||||
@@ -587,8 +591,11 @@ void NetworkReplicator::DespawnObject(ScriptingObject* obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Delete object locally
|
// Delete object locally
|
||||||
|
NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Despawn object {}", item.ObjectId);
|
||||||
|
DespawnedObjects.Add(item.ObjectId);
|
||||||
if (item.AsNetworkObject)
|
if (item.AsNetworkObject)
|
||||||
item.AsNetworkObject->OnNetworkDespawn();
|
item.AsNetworkObject->OnNetworkDespawn();
|
||||||
|
Objects.Remove(it);
|
||||||
DeleteNetworkObject(obj);
|
DeleteNetworkObject(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -745,6 +752,7 @@ void NetworkInternal::NetworkReplicatorClientDisconnected(NetworkClient* client)
|
|||||||
despawn.Targets = MoveTemp(item.TargetClientIds);
|
despawn.Targets = MoveTemp(item.TargetClientIds);
|
||||||
|
|
||||||
// Delete object locally
|
// Delete object locally
|
||||||
|
NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Despawn object {}", item.ObjectId);
|
||||||
if (item.AsNetworkObject)
|
if (item.AsNetworkObject)
|
||||||
item.AsNetworkObject->OnNetworkDespawn();
|
item.AsNetworkObject->OnNetworkDespawn();
|
||||||
DeleteNetworkObject(obj);
|
DeleteNetworkObject(obj);
|
||||||
@@ -779,6 +787,7 @@ void NetworkInternal::NetworkReplicatorClear()
|
|||||||
SAFE_DELETE(CachedReadStream);
|
SAFE_DELETE(CachedReadStream);
|
||||||
NewClients.Clear();
|
NewClients.Clear();
|
||||||
CachedTargets.Clear();
|
CachedTargets.Clear();
|
||||||
|
DespawnedObjects.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkInternal::NetworkReplicatorPreUpdate()
|
void NetworkInternal::NetworkReplicatorPreUpdate()
|
||||||
@@ -1025,6 +1034,8 @@ void NetworkInternal::OnNetworkMessageObjectReplicate(NetworkEvent& event, Netwo
|
|||||||
NetworkMessageObjectReplicate msgData;
|
NetworkMessageObjectReplicate msgData;
|
||||||
event.Message.ReadStructure(msgData);
|
event.Message.ReadStructure(msgData);
|
||||||
ScopeLock lock(ObjectsLock);
|
ScopeLock lock(ObjectsLock);
|
||||||
|
if (DespawnedObjects.Contains(msgData.ObjectId))
|
||||||
|
return; // Skip replicating not-existing objects
|
||||||
NetworkReplicatedObject* e = ResolveObject(msgData.ObjectId, msgData.ParentId, msgData.ObjectTypeName);
|
NetworkReplicatedObject* e = ResolveObject(msgData.ObjectId, msgData.ParentId, msgData.ObjectTypeName);
|
||||||
if (e)
|
if (e)
|
||||||
{
|
{
|
||||||
@@ -1227,6 +1238,8 @@ void NetworkInternal::OnNetworkMessageObjectDespawn(NetworkEvent& event, Network
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Remove object
|
// Remove object
|
||||||
|
NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Despawn object {}", msgData.ObjectId);
|
||||||
|
DespawnedObjects.Add(msgData.ObjectId);
|
||||||
if (item.AsNetworkObject)
|
if (item.AsNetworkObject)
|
||||||
item.AsNetworkObject->OnNetworkDespawn();
|
item.AsNetworkObject->OnNetworkDespawn();
|
||||||
Objects.Remove(obj);
|
Objects.Remove(obj);
|
||||||
|
|||||||
Reference in New Issue
Block a user