Add CPU profiler events to various networking functions

This commit is contained in:
Wojtek Figat
2023-05-23 16:11:34 +02:00
parent f5adbc08fa
commit 4879b9bd90
2 changed files with 68 additions and 54 deletions

View File

@@ -6,6 +6,7 @@
#include "Engine/Core/Log.h" #include "Engine/Core/Log.h"
#include "Engine/Core/Math/Math.h" #include "Engine/Core/Math/Math.h"
#include "Engine/Platform/CPUInfo.h" #include "Engine/Platform/CPUInfo.h"
#include "Engine/Profiler/ProfilerCPU.h"
namespace namespace
{ {
@@ -131,6 +132,7 @@ void NetworkPeer::Disconnect(const NetworkConnection& connection)
bool NetworkPeer::PopEvent(NetworkEvent& eventRef) bool NetworkPeer::PopEvent(NetworkEvent& eventRef)
{ {
PROFILE_CPU();
return NetworkDriver->PopEvent(&eventRef); return NetworkDriver->PopEvent(&eventRef);
} }

View File

@@ -1302,28 +1302,31 @@ void NetworkInternal::NetworkReplicatorUpdate()
} }
// Apply parts replication // Apply parts replication
for (int32 i = ReplicationParts.Count() - 1; i >= 0; i--)
{ {
auto& e = ReplicationParts[i]; PROFILE_CPU_NAMED("ReplicationParts");
if (e.PartsLeft > 0) for (int32 i = ReplicationParts.Count() - 1; i >= 0; i--)
{ {
// TODO: remove replication items after some TTL to prevent memory leaks auto& e = ReplicationParts[i];
continue; if (e.PartsLeft > 0)
}
ScriptingObject* obj = e.Object.Get();
if (obj)
{
auto it = Objects.Find(obj->GetID());
if (it != Objects.End())
{ {
auto& item = it->Item; // TODO: remove replication items after some TTL to prevent memory leaks
continue;
// Replicate from all collected parts data
InvokeObjectReplication(item, e.OwnerFrame, e.Data.Get(), e.Data.Count(), e.OwnerClientId);
} }
} ScriptingObject* obj = e.Object.Get();
if (obj)
{
auto it = Objects.Find(obj->GetID());
if (it != Objects.End())
{
auto& item = it->Item;
ReplicationParts.RemoveAt(i); // Replicate from all collected parts data
InvokeObjectReplication(item, e.OwnerFrame, e.Data.Get(), e.Data.Count(), e.OwnerClientId);
}
}
ReplicationParts.RemoveAt(i);
}
} }
// Brute force synchronize all networked objects with clients // Brute force synchronize all networked objects with clients
@@ -1438,49 +1441,52 @@ void NetworkInternal::NetworkReplicatorUpdate()
} }
// Invoke RPCs // Invoke RPCs
for (auto& e : RpcQueue)
{ {
ScriptingObject* obj = e.Object.Get(); PROFILE_CPU_NAMED("Rpc");
if (!obj) for (auto& e : RpcQueue)
continue; {
auto it = Objects.Find(obj->GetID()); ScriptingObject* obj = e.Object.Get();
if (it == Objects.End()) if (!obj)
continue; continue;
auto& item = it->Item; auto it = Objects.Find(obj->GetID());
if (it == Objects.End())
continue;
auto& item = it->Item;
// Send despawn message // Send despawn message
//NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Rpc {}::{} object ID={}", e.Name.First.ToString(), String(e.Name.Second), item.ToString()); //NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Rpc {}::{} object ID={}", e.Name.First.ToString(), String(e.Name.Second), item.ToString());
NetworkMessageObjectRpc msgData; NetworkMessageObjectRpc msgData;
msgData.ObjectId = item.ObjectId; msgData.ObjectId = item.ObjectId;
if (isClient) if (isClient)
{ {
// Remap local client object ids into server ids // Remap local client object ids into server ids
IdsRemappingTable.KeyOf(msgData.ObjectId, &msgData.ObjectId); IdsRemappingTable.KeyOf(msgData.ObjectId, &msgData.ObjectId);
} }
GetNetworkName(msgData.RpcTypeName, e.Name.First.GetType().Fullname); GetNetworkName(msgData.RpcTypeName, e.Name.First.GetType().Fullname);
GetNetworkName(msgData.RpcName, e.Name.Second); GetNetworkName(msgData.RpcName, e.Name.Second);
msgData.ArgsSize = (uint16)e.ArgsData.Length(); msgData.ArgsSize = (uint16)e.ArgsData.Length();
NetworkMessage msg = peer->BeginSendMessage(); NetworkMessage msg = peer->BeginSendMessage();
msg.WriteStructure(msgData); msg.WriteStructure(msgData);
msg.WriteBytes(e.ArgsData.Get(), e.ArgsData.Length()); msg.WriteBytes(e.ArgsData.Get(), e.ArgsData.Length());
NetworkChannelType channel = (NetworkChannelType)e.Info.Channel; NetworkChannelType channel = (NetworkChannelType)e.Info.Channel;
if (e.Info.Server && isClient) if (e.Info.Server && isClient)
{ {
// Client -> Server // Client -> Server
#if USE_NETWORK_REPLICATOR_LOG #if USE_NETWORK_REPLICATOR_LOG
if (e.Targets.Length() != 0) if (e.Targets.Length() != 0)
NETWORK_REPLICATOR_LOG(Error, "[NetworkReplicator] Server RPC '{}::{}' called with non-empty list of targets is not supported (only server will receive it)", e.Name.First.ToString(), e.Name.Second.ToString()); NETWORK_REPLICATOR_LOG(Error, "[NetworkReplicator] Server RPC '{}::{}' called with non-empty list of targets is not supported (only server will receive it)", e.Name.First.ToString(), e.Name.Second.ToString());
#endif #endif
peer->EndSendMessage(channel, msg); peer->EndSendMessage(channel, msg);
} }
else if (e.Info.Client && (isServer || isHost)) else if (e.Info.Client && (isServer || isHost))
{ {
// Server -> Client(s) // Server -> Client(s)
BuildCachedTargets(NetworkManager::Clients, item.TargetClientIds, e.Targets, NetworkManager::LocalClientId); BuildCachedTargets(NetworkManager::Clients, item.TargetClientIds, e.Targets, NetworkManager::LocalClientId);
peer->EndSendMessage(channel, msg, CachedTargets); peer->EndSendMessage(channel, msg, CachedTargets);
}
} }
RpcQueue.Clear();
} }
RpcQueue.Clear();
// Clear networked objects mapping table // Clear networked objects mapping table
Scripting::ObjectsLookupIdMapping.Set(nullptr); Scripting::ObjectsLookupIdMapping.Set(nullptr);
@@ -1488,6 +1494,7 @@ void NetworkInternal::NetworkReplicatorUpdate()
void NetworkInternal::OnNetworkMessageObjectReplicate(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer) void NetworkInternal::OnNetworkMessageObjectReplicate(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer)
{ {
PROFILE_CPU();
NetworkMessageObjectReplicate msgData; NetworkMessageObjectReplicate msgData;
event.Message.ReadStructure(msgData); event.Message.ReadStructure(msgData);
ScopeLock lock(ObjectsLock); ScopeLock lock(ObjectsLock);
@@ -1519,6 +1526,7 @@ void NetworkInternal::OnNetworkMessageObjectReplicate(NetworkEvent& event, Netwo
void NetworkInternal::OnNetworkMessageObjectReplicatePart(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer) void NetworkInternal::OnNetworkMessageObjectReplicatePart(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer)
{ {
PROFILE_CPU();
NetworkMessageObjectReplicatePart msgData; NetworkMessageObjectReplicatePart msgData;
event.Message.ReadStructure(msgData); event.Message.ReadStructure(msgData);
ScopeLock lock(ObjectsLock); ScopeLock lock(ObjectsLock);
@@ -1531,6 +1539,7 @@ void NetworkInternal::OnNetworkMessageObjectReplicatePart(NetworkEvent& event, N
void NetworkInternal::OnNetworkMessageObjectSpawn(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer) void NetworkInternal::OnNetworkMessageObjectSpawn(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer)
{ {
PROFILE_CPU();
NetworkMessageObjectSpawn msgData; NetworkMessageObjectSpawn msgData;
event.Message.ReadStructure(msgData); event.Message.ReadStructure(msgData);
auto* msgDataItems = (NetworkMessageObjectSpawnItem*)event.Message.SkipBytes(msgData.ItemsCount * sizeof(NetworkMessageObjectSpawnItem)); auto* msgDataItems = (NetworkMessageObjectSpawnItem*)event.Message.SkipBytes(msgData.ItemsCount * sizeof(NetworkMessageObjectSpawnItem));
@@ -1759,6 +1768,7 @@ void NetworkInternal::OnNetworkMessageObjectSpawn(NetworkEvent& event, NetworkCl
void NetworkInternal::OnNetworkMessageObjectDespawn(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer) void NetworkInternal::OnNetworkMessageObjectDespawn(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer)
{ {
PROFILE_CPU();
NetworkMessageObjectDespawn msgData; NetworkMessageObjectDespawn msgData;
event.Message.ReadStructure(msgData); event.Message.ReadStructure(msgData);
ScopeLock lock(ObjectsLock); ScopeLock lock(ObjectsLock);
@@ -1790,6 +1800,7 @@ void NetworkInternal::OnNetworkMessageObjectDespawn(NetworkEvent& event, Network
void NetworkInternal::OnNetworkMessageObjectRole(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer) void NetworkInternal::OnNetworkMessageObjectRole(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer)
{ {
PROFILE_CPU();
NetworkMessageObjectRole msgData; NetworkMessageObjectRole msgData;
event.Message.ReadStructure(msgData); event.Message.ReadStructure(msgData);
ScopeLock lock(ObjectsLock); ScopeLock lock(ObjectsLock);
@@ -1833,6 +1844,7 @@ void NetworkInternal::OnNetworkMessageObjectRole(NetworkEvent& event, NetworkCli
void NetworkInternal::OnNetworkMessageObjectRpc(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer) void NetworkInternal::OnNetworkMessageObjectRpc(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer)
{ {
PROFILE_CPU();
NetworkMessageObjectRpc msgData; NetworkMessageObjectRpc msgData;
event.Message.ReadStructure(msgData); event.Message.ReadStructure(msgData);
ScopeLock lock(ObjectsLock); ScopeLock lock(ObjectsLock);