Browse Source

Relax latency requirements for online games

pull/5803/head
staphen 3 years ago committed by Anders Jenbo
parent
commit
076da2aefe
  1. 21
      Source/dvlnet/base.cpp
  2. 1
      Source/dvlnet/base.h

21
Source/dvlnet/base.cpp

@ -251,7 +251,7 @@ bool base::SNetReceiveTurns(char **data, size_t *size, uint32_t *status)
std::deque<turn_t> &turnQueue = playerState.turnQueue; std::deque<turn_t> &turnQueue = playerState.turnQueue;
while (!turnQueue.empty()) { while (!turnQueue.empty()) {
const turn_t &turn = turnQueue.front(); const turn_t &turn = turnQueue.front();
seq_t diff = turn.SequenceNumber - next_turn; seq_t diff = turn.SequenceNumber - current_turn;
if (diff <= 0x7F) if (diff <= 0x7F)
break; break;
turnQueue.pop_front(); turnQueue.pop_front();
@ -269,7 +269,7 @@ bool base::SNetReceiveTurns(char **data, size_t *size, uint32_t *status)
continue; continue;
const turn_t &turn = turnQueue.front(); const turn_t &turn = turnQueue.front();
if (turn.SequenceNumber != next_turn) if (turn.SequenceNumber != current_turn)
continue; continue;
playerState.lastTurnValue = turn.Value; playerState.lastTurnValue = turn.Value;
@ -281,7 +281,7 @@ bool base::SNetReceiveTurns(char **data, size_t *size, uint32_t *status)
data[i] = reinterpret_cast<char *>(&playerState.lastTurnValue); data[i] = reinterpret_cast<char *>(&playerState.lastTurnValue);
} }
next_turn++; current_turn++;
return true; return true;
} }
@ -309,6 +309,7 @@ bool base::SNetSendTurn(char *data, unsigned int size)
turn_t turn; turn_t turn;
turn.SequenceNumber = next_turn; turn.SequenceNumber = next_turn;
std::memcpy(&turn.Value, data, size); std::memcpy(&turn.Value, data, size);
next_turn++;
PlayerState &playerState = playerStateTable_[plr_self]; PlayerState &playerState = playerStateTable_[plr_self];
std::deque<turn_t> &turnQueue = playerState.turnQueue; std::deque<turn_t> &turnQueue = playerState.turnQueue;
@ -338,9 +339,10 @@ void base::SendFirstTurnIfReady(plr_t player)
if (turnQueue.empty()) if (turnQueue.empty())
return; return;
turn_t turn = turnQueue.back(); for (turn_t turn : turnQueue) {
auto pkt = pktfty->make_packet<PT_TURN>(plr_self, player, turn); auto pkt = pktfty->make_packet<PT_TURN>(plr_self, player, turn);
send(*pkt); send(*pkt);
}
} }
void base::MakeReady(seq_t sequenceNumber) void base::MakeReady(seq_t sequenceNumber)
@ -348,14 +350,15 @@ void base::MakeReady(seq_t sequenceNumber)
if (!awaitingSequenceNumber_) if (!awaitingSequenceNumber_)
return; return;
current_turn = sequenceNumber;
next_turn = sequenceNumber; next_turn = sequenceNumber;
awaitingSequenceNumber_ = false; awaitingSequenceNumber_ = false;
PlayerState &playerState = playerStateTable_[plr_self]; PlayerState &playerState = playerStateTable_[plr_self];
std::deque<turn_t> &turnQueue = playerState.turnQueue; std::deque<turn_t> &turnQueue = playerState.turnQueue;
if (!turnQueue.empty()) { for (turn_t &turn : turnQueue) {
turn_t &turn = turnQueue.front();
turn.SequenceNumber = next_turn; turn.SequenceNumber = next_turn;
next_turn++;
SendTurnIfReady(turn); SendTurnIfReady(turn);
} }
} }
@ -370,7 +373,7 @@ void base::SNetGetProviderCaps(struct _SNETCAPS *caps)
caps->bytessec = 1000000; // ? caps->bytessec = 1000000; // ?
caps->latencyms = 0; // unused caps->latencyms = 0; // unused
caps->defaultturnssec = 10; // ? caps->defaultturnssec = 10; // ?
caps->defaultturnsintransit = 1; // maximum acceptable number caps->defaultturnsintransit = 2; // maximum acceptable number
// of turns in queue? // of turns in queue?
} }

1
Source/dvlnet/base.h

@ -69,6 +69,7 @@ protected:
uint32_t roundTripLatency = {}; uint32_t roundTripLatency = {};
}; };
seq_t current_turn = 0;
seq_t next_turn = 0; seq_t next_turn = 0;
message_t message_last; message_t message_last;
std::deque<message_t> message_queue; std::deque<message_t> message_queue;

Loading…
Cancel
Save