Move did handshake logic to connection data plus an optimization

Signed-off-by: puvvadar <puvvadar@amazon.com>
This commit is contained in:
puvvadar
2021-09-30 19:59:34 -07:00
parent 8581b30260
commit 2811a84187
9 changed files with 66 additions and 15 deletions
@@ -6,15 +6,24 @@ namespace {{ xml.attrib['Name'] }}
{
switch (aznumeric_cast<int32_t>(packetHeader.GetPacketType()))
{
{% set hs = namespace(handshake=false) %}
{% for Packet in xml.iter('Packet') %}
{% if ('HandshakePacket' in Packet.attrib) and (Packet.attrib['HandshakePacket'] == 'true') %}
{% set hs.handshake = True %}
{% endif %}
{% endfor %}
{% for Packet in xml.iter('Packet') %}
case aznumeric_cast<int32_t>({{ Packet.attrib['Name'] }}::Type):
{
AZLOG(Debug_DispatchPackets, "Received packet %s", "{{ Packet.attrib['Name'] }}");
{% if hs.handshake %}
{% if ('HandshakePacket' not in Packet.attrib) or (Packet.attrib['HandshakePacket'] == 'false') %}
if (!handler.IsHandshakeComplete())
if (!handler.IsHandshakeComplete(connection))
{
return AzNetworking::PacketDispatchResult::Skipped;
}
{% endif %}
{% endif %}
{{ Packet.attrib['Name'] }} packet;
@@ -50,5 +50,14 @@ namespace Multiplayer
//! Sets the state of connection whether update messages can be sent or not.
//! @param canSendUpdates the state value
virtual void SetCanSendUpdates(bool canSendUpdates) = 0;
//! Fetches the state of connection whether handshake logic has completed
//! @return true if handshake has completed
virtual bool DidHandshake() const = 0;
//! Sets the state of connection whether handshake logic has completed
//! @param didHandshake if handshake logic has completed
virtual void SetDidHandshake(bool didHandshake) = 0;
};
}
@@ -33,6 +33,8 @@ namespace Multiplayer
void Update(AZ::TimeMs hostTimeMs) override;
bool CanSendUpdates() const override;
void SetCanSendUpdates(bool canSendUpdates) override;
bool DidHandshake() const override;
void SetDidHandshake(bool didHandshake) override;
//! @}
const AZStd::string& GetProviderTicket() const;
@@ -43,6 +45,7 @@ namespace Multiplayer
AZStd::string m_providerTicket;
AzNetworking::IConnection* m_connection = nullptr;
bool m_canSendUpdates = true;
bool m_didHandshake = false;
};
}
@@ -27,4 +27,14 @@ namespace Multiplayer
{
m_providerTicket = ticket;
}
inline bool ClientToServerConnectionData::DidHandshake() const
{
return m_didHandshake;
}
inline void ClientToServerConnectionData::SetDidHandshake(bool didHandshake)
{
m_didHandshake = didHandshake;
}
}
@@ -33,6 +33,8 @@ namespace Multiplayer
void Update(AZ::TimeMs hostTimeMs) override;
bool CanSendUpdates() const override;
void SetCanSendUpdates(bool canSendUpdates) override;
bool DidHandshake() const override;
void SetDidHandshake(bool didHandshake) override;
//! @}
NetworkEntityHandle GetPrimaryPlayerEntity();
@@ -52,6 +54,7 @@ namespace Multiplayer
AZStd::string m_providerTicket;
AzNetworking::IConnection* m_connection = nullptr;
bool m_canSendUpdates = false;
bool m_didHandshake = false;
};
}
@@ -38,4 +38,14 @@ namespace Multiplayer
{
m_providerTicket = ticket;
}
inline bool ServerToClientConnectionData::DidHandshake() const
{
return m_didHandshake;
}
inline void ServerToClientConnectionData::SetDidHandshake(bool didHandshake)
{
m_didHandshake = didHandshake;
}
}
@@ -33,7 +33,6 @@ namespace Multiplayer
MultiplayerEditorConnection();
~MultiplayerEditorConnection() = default;
bool IsHandshakeComplete() const { return true; };
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerInit& packet);
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerReady& packet);
@@ -442,9 +442,9 @@ namespace Multiplayer
MultiplayerPackets::SyncConsole m_syncPacket;
};
bool MultiplayerSystemComponent::IsHandshakeComplete() const
bool MultiplayerSystemComponent::IsHandshakeComplete(AzNetworking::IConnection* connection) const
{
return m_didHandshake;
return reinterpret_cast<IConnectionData*>(connection->GetUserData())->DidHandshake();
}
bool MultiplayerSystemComponent::HandleRequest
@@ -471,7 +471,7 @@ namespace Multiplayer
if (connection->SendReliablePacket(MultiplayerPackets::Accept(InvalidHostId, sv_map)))
{
m_didHandshake = true;
reinterpret_cast<ServerToClientConnectionData*>(connection->GetUserData())->SetDidHandshake(true);
// Sync our console
ConsoleReplicator consoleReplicator(connection);
@@ -488,7 +488,7 @@ namespace Multiplayer
[[maybe_unused]] MultiplayerPackets::Accept& packet
)
{
m_didHandshake = true;
reinterpret_cast<ClientToServerConnectionData*>(connection->GetUserData())->SetDidHandshake(true);
AZ::CVarFixedString commandString = "sv_map " + packet.GetMap();
AZ::Interface<AZ::IConsole>::Get()->PerformCommand(commandString.c_str());
@@ -903,8 +903,9 @@ namespace Multiplayer
// Unfortunately necessary, as NotifyPreRender can update transforms and thus cause a deadlock inside the vis system
AZStd::vector<NetBindComponent*> gatheredEntities;
INetworkEntityManager* netEntityManager = GetNetworkEntityManager();
AZ::Interface<AzFramework::IVisibilitySystem>::Get()->GetDefaultVisibilityScene()->Enumerate(viewFrustum,
[&gatheredEntities](const AzFramework::IVisibilityScene::NodeData& nodeData)
[netEntityManager, &gatheredEntities](const AzFramework::IVisibilityScene::NodeData& nodeData)
{
gatheredEntities.reserve(gatheredEntities.size() + nodeData.m_entries.size());
for (AzFramework::VisibilityEntry* visEntry : nodeData.m_entries)
@@ -912,10 +913,14 @@ namespace Multiplayer
if (visEntry->m_typeFlags & AzFramework::VisibilityEntry::TypeFlags::TYPE_Entity)
{
AZ::Entity* entity = static_cast<AZ::Entity*>(visEntry->m_userData);
NetBindComponent* netBindComponent = entity->FindComponent<NetBindComponent>();
if (netBindComponent != nullptr)
NetEntityId netEntitydId = netEntityManager->GetNetEntityIdById(entity->GetId());
if (netEntitydId != InvalidNetEntityId)
{
gatheredEntities.push_back(netBindComponent);
NetBindComponent* netBindComponent = netEntityManager->GetEntity(netEntitydId).GetNetBindComponent();
if (netBindComponent != nullptr)
{
gatheredEntities.push_back(netBindComponent);
}
}
}
}
@@ -932,10 +937,14 @@ namespace Multiplayer
for (auto& iter : *(m_networkEntityManager.GetNetworkEntityTracker()))
{
AZ::Entity* entity = iter.second;
NetBindComponent* netBindComponent = entity->FindComponent<NetBindComponent>();
if (netBindComponent != nullptr)
NetEntityId netEntitydId = GetNetworkEntityManager()->GetNetEntityIdById(entity->GetId());
if (netEntitydId != InvalidNetEntityId)
{
netBindComponent->NotifyPreRender(deltaTime);
NetBindComponent* netBindComponent = GetNetworkEntityManager()->GetEntity(netEntitydId).GetNetBindComponent();
if (netBindComponent != nullptr)
{
netBindComponent->NotifyPreRender(deltaTime);
}
}
}
}
@@ -76,7 +76,7 @@ namespace Multiplayer
int GetTickOrder() override;
//! @}
bool IsHandshakeComplete() const;
bool IsHandshakeComplete(AzNetworking::IConnection* connection) const;
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::Connect& packet);
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::Accept& packet);
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::ReadyForEntityUpdates& packet);
@@ -159,7 +159,6 @@ namespace Multiplayer
double m_serverSendAccumulator = 0.0;
float m_renderBlendFactor = 0.0f;
float m_tickFactor = 0.0f;
bool m_didHandshake = false;
#if !defined(AZ_RELEASE_BUILD)
MultiplayerEditorConnection m_editorConnectionListener;