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;
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<char *>(&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<turn_t> &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<PT_TURN>(plr_self, player, turn);
send(*pkt);
for (turn_t turn : turnQueue) {
auto pkt = pktfty->make_packet<PT_TURN>(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<turn_t> &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?
}

1
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_t> message_queue;

Loading…
Cancel
Save