From 076da2aefeb54dcb29697f4afcb498dcdb2804b3 Mon Sep 17 00:00:00 2001 From: staphen Date: Tue, 14 Feb 2023 23:42:35 -0500 Subject: [PATCH] Relax latency requirements for online games --- Source/dvlnet/base.cpp | 21 ++++++++++++--------- Source/dvlnet/base.h | 1 + 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Source/dvlnet/base.cpp b/Source/dvlnet/base.cpp index cafc093c7..cc577d115 100644 --- a/Source/dvlnet/base.cpp +++ b/Source/dvlnet/base.cpp @@ -251,7 +251,7 @@ bool base::SNetReceiveTurns(char **data, size_t *size, uint32_t *status) std::deque &turnQueue = playerState.turnQueue; while (!turnQueue.empty()) { const turn_t &turn = turnQueue.front(); - seq_t diff = turn.SequenceNumber - next_turn; + seq_t diff = turn.SequenceNumber - current_turn; if (diff <= 0x7F) break; turnQueue.pop_front(); @@ -269,7 +269,7 @@ bool base::SNetReceiveTurns(char **data, size_t *size, uint32_t *status) continue; const turn_t &turn = turnQueue.front(); - if (turn.SequenceNumber != next_turn) + if (turn.SequenceNumber != current_turn) continue; playerState.lastTurnValue = turn.Value; @@ -281,7 +281,7 @@ bool base::SNetReceiveTurns(char **data, size_t *size, uint32_t *status) data[i] = reinterpret_cast(&playerState.lastTurnValue); } - next_turn++; + current_turn++; return true; } @@ -309,6 +309,7 @@ bool base::SNetSendTurn(char *data, unsigned int size) turn_t turn; turn.SequenceNumber = next_turn; std::memcpy(&turn.Value, data, size); + next_turn++; PlayerState &playerState = playerStateTable_[plr_self]; std::deque &turnQueue = playerState.turnQueue; @@ -338,9 +339,10 @@ void base::SendFirstTurnIfReady(plr_t player) if (turnQueue.empty()) return; - turn_t turn = turnQueue.back(); - auto pkt = pktfty->make_packet(plr_self, player, turn); - send(*pkt); + for (turn_t turn : turnQueue) { + auto pkt = pktfty->make_packet(plr_self, player, turn); + send(*pkt); + } } void base::MakeReady(seq_t sequenceNumber) @@ -348,14 +350,15 @@ void base::MakeReady(seq_t sequenceNumber) if (!awaitingSequenceNumber_) return; + current_turn = sequenceNumber; next_turn = sequenceNumber; awaitingSequenceNumber_ = false; PlayerState &playerState = playerStateTable_[plr_self]; std::deque &turnQueue = playerState.turnQueue; - if (!turnQueue.empty()) { - turn_t &turn = turnQueue.front(); + for (turn_t &turn : turnQueue) { turn.SequenceNumber = next_turn; + next_turn++; SendTurnIfReady(turn); } } @@ -370,7 +373,7 @@ void base::SNetGetProviderCaps(struct _SNETCAPS *caps) caps->bytessec = 1000000; // ? caps->latencyms = 0; // unused caps->defaultturnssec = 10; // ? - caps->defaultturnsintransit = 1; // maximum acceptable number + caps->defaultturnsintransit = 2; // maximum acceptable number // of turns in queue? } diff --git a/Source/dvlnet/base.h b/Source/dvlnet/base.h index 2aec23869..2ed4448d8 100644 --- a/Source/dvlnet/base.h +++ b/Source/dvlnet/base.h @@ -69,6 +69,7 @@ protected: uint32_t roundTripLatency = {}; }; + seq_t current_turn = 0; seq_t next_turn = 0; message_t message_last; std::deque message_queue;