Add CPU profiler events to various networking functions
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user