From c6bc90a82a8e97aac2d271b7156211d7957ad557 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Fri, 12 Sep 2025 13:52:55 +0300 Subject: [PATCH] _lagdriver fixes --- Source/Engine/Engine/Engine.cpp | 8 +++++- Source/Engine/Engine/Time.cpp | 22 +++++++++++----- .../Engine/Networking/Drivers/ENetDriver.cpp | 12 ++++++--- .../Networking/Drivers/NetworkLagDriver.cpp | 26 +++++++++++++++---- .../Networking/Drivers/NetworkLagDriver.h | 3 +++ 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/Source/Engine/Engine/Engine.cpp b/Source/Engine/Engine/Engine.cpp index 4e89af174..e64af0d4b 100644 --- a/Source/Engine/Engine/Engine.cpp +++ b/Source/Engine/Engine/Engine.cpp @@ -236,12 +236,18 @@ int32 Engine::Main(const Char* cmdLine) } // Start physics simulation - if (Time::OnBeginPhysics(time)) + int phys = 0; + while (Time::OnBeginPhysics(time)) { + phys++; OnFixedUpdate(); OnLateFixedUpdate(); Time::OnEndPhysics(); } + /*if (phys == 0) + LOG(Info, "no ticks"); + else */if (phys > 1) + LOG(Info, "{} ticks", phys); // Draw frame if (Time::OnBeginDraw(time)) diff --git a/Source/Engine/Engine/Time.cpp b/Source/Engine/Engine/Time.cpp index e55e76971..26744d21e 100644 --- a/Source/Engine/Engine/Time.cpp +++ b/Source/Engine/Engine/Time.cpp @@ -95,7 +95,8 @@ bool Time::TickData::OnTickBegin(double time, float targetFps, float maxDeltaTim if (targetFps > ZeroTolerance) { int skip = (int)(1 + (time - NextBegin) * targetFps); - NextBegin += (1.0 / targetFps) * skip; + //NextBegin += (1.0 / targetFps) * skip; + NextBegin = time + (1.0 / targetFps); } } @@ -146,25 +147,34 @@ bool Time::FixedStepTickData::OnTickBegin(double time, float targetFps, float ma deltaTime = (double)maxDeltaTime; NextBegin = time; } - +#if false if (targetFps > ZeroTolerance) { int skip = (int)(1 + (time - NextBegin) * targetFps); NextBegin += (1.0 / targetFps) * skip; } +#else + else if (targetFps > ZeroTolerance) + { + deltaTime = (1.0 / targetFps); + //int skip = (int)(1 + (time - NextBegin) * targetFps); + //NextBegin += (1.0 / targetFps) * skip; + NextBegin += deltaTime; + } +#endif } - Samples.Add(deltaTime); + //Samples.Add(deltaTime); // Check if last few ticks were not taking too long so it's running slowly - const bool isRunningSlowly = Samples.Average() > 1.5 * minDeltaTime; + /*const bool isRunningSlowly = Samples.Average() > 1.5 * minDeltaTime; if (!isRunningSlowly) { // Make steps fixed size const double diff = deltaTime - minDeltaTime; time -= diff; deltaTime = minDeltaTime; - } - + }*/ + // Update data Advance(time, deltaTime); diff --git a/Source/Engine/Networking/Drivers/ENetDriver.cpp b/Source/Engine/Networking/Drivers/ENetDriver.cpp index c9c3e16f9..7acfd1305 100644 --- a/Source/Engine/Networking/Drivers/ENetDriver.cpp +++ b/Source/Engine/Networking/Drivers/ENetDriver.cpp @@ -13,6 +13,7 @@ #define ENET_IMPLEMENTATION #define _WINSOCK_DEPRECATED_NO_WARNINGS #include +#include #undef _WINSOCK_DEPRECATED_NO_WARNINGS #undef SendMessage @@ -33,7 +34,7 @@ ENetPacketFlag ChannelTypeToPacketFlag(const NetworkChannelType channel) return static_cast(flag); } -void SendPacketToPeer(ENetPeer* peer, const NetworkChannelType channelType, const NetworkMessage& message) +void SendPacketToPeer(ENetHost* host, ENetPeer* peer, const NetworkChannelType channelType, const NetworkMessage& message) { // Covert our channel type to the internal ENet packet flags const ENetPacketFlag flag = ChannelTypeToPacketFlag(channelType); @@ -48,6 +49,7 @@ void SendPacketToPeer(ENetPeer* peer, const NetworkChannelType channelType, cons enet_peer_send(peer, 0, packet); // TODO: To reduce latency, we can use `enet_host_flush` to flush all packets. Maybe some API, like NetworkManager::FlushQueues()? + enet_host_flush(host); } ENetDriver::ENetDriver(const SpawnParams& params) @@ -166,7 +168,9 @@ bool ENetDriver::PopEvent(NetworkEvent& eventPtr) { ASSERT(_host); ENetEvent event; + enet_host_flush(_host); // Flush outbound packets to us so we can handle them immediately const int result = enet_host_service(_host, &event, 0); + const auto tick = Time::Update.TicksCount; if (result < 0) LOG(Error, "Failed to check ENet events!"); if (result > 0) @@ -213,7 +217,7 @@ bool ENetDriver::PopEvent(NetworkEvent& eventPtr) void ENetDriver::SendMessage(const NetworkChannelType channelType, const NetworkMessage& message) { ASSERT(!IsServer()); - SendPacketToPeer(_peer, channelType, message); + SendPacketToPeer(_host, _peer, channelType, message); } void ENetDriver::SendMessage(NetworkChannelType channelType, const NetworkMessage& message, NetworkConnection target) @@ -222,7 +226,7 @@ void ENetDriver::SendMessage(NetworkChannelType channelType, const NetworkMessag ENetPeer* peer; if (_peerMap.TryGet(target.ConnectionId, peer) && peer && peer->state == ENET_PEER_STATE_CONNECTED) { - SendPacketToPeer(peer, channelType, message); + SendPacketToPeer(_host, peer, channelType, message); } } @@ -234,7 +238,7 @@ void ENetDriver::SendMessage(const NetworkChannelType channelType, const Network { if (_peerMap.TryGet(target.ConnectionId, peer) && peer && peer->state == ENET_PEER_STATE_CONNECTED) { - SendPacketToPeer(peer, channelType, message); + SendPacketToPeer(_host, peer, channelType, message); } } } diff --git a/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp b/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp index b7e0f142c..0162cb099 100644 --- a/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp +++ b/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp @@ -97,11 +97,15 @@ bool NetworkLagDriver::PopEvent(NetworkEvent& eventPtr) if (!_driver) return false; + const auto delta2 = Time::Current != nullptr ? Time::Current->UnscaledDeltaTime : Time::Update.UnscaledDeltaTime; // Try to pop lagged event from the queue for (int32 i = 0; i < _events.Count(); i++) { auto& e = _events[i]; - if (e.Lag > 0.0) + e.LagTime -= delta2; + //if (e.Lag > 0.0) + // continue; + if (e.LagTime > 0) continue; eventPtr = e.Event; @@ -117,6 +121,7 @@ bool NetworkLagDriver::PopEvent(NetworkEvent& eventPtr) auto& e = _events.AddOne(); e.Lag = (double)Lag; + e.LagTime = /*Time::Current->UnscaledTime + */TimeSpan::FromMilliseconds(Lag); e.Event = eventPtr; } return false; @@ -130,8 +135,10 @@ void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const N return; } + //const auto tick = Time::Current->TicksCount; auto& msg = _messages.AddOne(); msg.Lag = (double)Lag; + msg.LagTime = /*Time::Current->UnscaledTime +*/ TimeSpan::FromMilliseconds(Lag); msg.ChannelType = channelType; msg.Type = 0; msg.MessageData.Set(message.Buffer, message.Length); @@ -148,6 +155,7 @@ void NetworkLagDriver::SendMessage(NetworkChannelType channelType, const Network auto& msg = _messages.AddOne(); msg.Lag = (double)Lag; + msg.LagTime = /*Time::Current->UnscaledTime +*/ TimeSpan::FromMilliseconds(Lag); msg.ChannelType = channelType; msg.Type = 1; msg.Target = target; @@ -165,6 +173,7 @@ void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const N auto& msg = _messages.AddOne(); msg.Lag = (double)Lag; + msg.LagTime = /*Time::Current->UnscaledTime +*/ TimeSpan::FromMilliseconds(Lag); msg.ChannelType = channelType; msg.Type = 2; msg.Targets = targets; @@ -192,14 +201,20 @@ void NetworkLagDriver::OnUpdate() return; // Update all pending messages and events - const double deltaTime = Time::Update.UnscaledDeltaTime.GetTotalMilliseconds(); + const auto delta2 = Time::Current != nullptr ? Time::Current->UnscaledDeltaTime : Time::Update.UnscaledDeltaTime; for (int32 i = 0; i < _messages.Count(); i++) { auto& msg = _messages[i]; - msg.Lag -= deltaTime; - if (msg.Lag > 0.0) + //msg.Lag -= deltaTime; + //if (msg.Lag > 0.0) + // continue; + + msg.LagTime -= delta2; + if (msg.LagTime > 0) continue; + auto missed = (-msg.LagTime).GetTotalMilliseconds(); + // Use this helper message as a container to send the stored data and length to the ENet driver NetworkMessage message; message.Buffer = msg.MessageData.Get(); @@ -222,6 +237,7 @@ void NetworkLagDriver::OnUpdate() for (int32 i = 0; i < _events.Count(); i++) { auto& e = _events[i]; - e.Lag -= deltaTime; + //e.Lag -= deltaTime; + e.LagTime -= delta2; } } diff --git a/Source/Engine/Networking/Drivers/NetworkLagDriver.h b/Source/Engine/Networking/Drivers/NetworkLagDriver.h index 94197c44e..be95f5beb 100644 --- a/Source/Engine/Networking/Drivers/NetworkLagDriver.h +++ b/Source/Engine/Networking/Drivers/NetworkLagDriver.h @@ -8,6 +8,7 @@ #include "Engine/Networking/NetworkEvent.h" #include "Engine/Scripting/ScriptingObject.h" #include "Engine/Core/Collections/Array.h" +#include "Engine/Core/Types/TimeSpan.h" /// /// Low-level network transport interface implementation that is proxy of another nested INetworkDriver implementation but with lag simulation feature. @@ -20,6 +21,7 @@ private: struct LagMessage { double Lag; + TimeSpan LagTime; int32 Type; NetworkChannelType ChannelType; NetworkConnection Target; @@ -31,6 +33,7 @@ private: struct LagEvent { double Lag; + TimeSpan LagTime; NetworkEvent Event; };