_lagdriver fixes
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#define ENET_IMPLEMENTATION
|
||||
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
||||
#include <enet/enet.h>
|
||||
#include <Engine/Engine/Time.h>
|
||||
#undef _WINSOCK_DEPRECATED_NO_WARNINGS
|
||||
#undef SendMessage
|
||||
|
||||
@@ -33,7 +34,7 @@ ENetPacketFlag ChannelTypeToPacketFlag(const NetworkChannelType channel)
|
||||
return static_cast<ENetPacketFlag>(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
/// <summary>
|
||||
/// 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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user