Fixed incorrect server-start-delay (caused by the start delay

being delivered in a different thread, so adding DT in the main
thread was not the right time step).
This commit is contained in:
hiker 2017-05-29 15:08:32 +10:00
parent 742be06c21
commit 34af963cc1
2 changed files with 14 additions and 8 deletions

View File

@ -237,7 +237,6 @@ void ServerLobby::update(float dt)
m_client_ready_count.getData() == m_game_setup->getPlayerCount()) m_client_ready_count.getData() == m_game_setup->getPlayerCount())
{ {
signalRaceStartToClients(); signalRaceStartToClients();
m_server_delay = 0.1f;
m_client_ready_count.getData() = 0; m_client_ready_count.getData() = 0;
} }
m_client_ready_count.unlock(); m_client_ready_count.unlock();
@ -249,9 +248,10 @@ void ServerLobby::update(float dt)
// next state. // next state.
break; break;
case DELAY_SERVER: case DELAY_SERVER:
m_server_delay -= dt; if (m_server_delay < StkTime::getRealTime())
if (m_server_delay < 0)
{ {
Log::verbose("ServerLobby", "End delay at %lf",
StkTime::getRealTime());
m_state = RACING; m_state = RACING;
World::getWorld()->setReadyToRace(); World::getWorld()->setReadyToRace();
} }
@ -350,7 +350,8 @@ void ServerLobby::registerServer()
*/ */
void ServerLobby::signalRaceStartToClients() void ServerLobby::signalRaceStartToClients()
{ {
Log::verbose("Server", "Signaling race start to clients"); Log::verbose("Server", "Signaling race start to clients at %lf",
StkTime::getRealTime());
const std::vector<STKPeer*> &peers = STKHost::get()->getPeers(); const std::vector<STKPeer*> &peers = STKHost::get()->getPeers();
NetworkString *ns = getNetworkString(1); NetworkString *ns = getNetworkString(1);
ns->addUInt8(LE_START_RACE); ns->addUInt8(LE_START_RACE);
@ -935,12 +936,16 @@ void ServerLobby::finishedLoadingWorldClient(Event *event)
void ServerLobby::startedRaceOnClient(Event *event) void ServerLobby::startedRaceOnClient(Event *event)
{ {
m_client_ready_count.lock(); m_client_ready_count.lock();
Log::verbose("ServerLobby", "Host %d has started race.", Log::verbose("ServerLobby", "Host %d has started race at %lf.",
event->getPeer()->getHostId()); event->getPeer()->getHostId(), StkTime::getRealTime());
m_client_ready_count.getData()++; m_client_ready_count.getData()++;
if (m_client_ready_count.getData() == m_game_setup->getPlayerCount()) if (m_client_ready_count.getData() == m_game_setup->getPlayerCount())
{ {
m_state = DELAY_SERVER; m_state = DELAY_SERVER;
m_server_delay = StkTime::getRealTime() + 0.1f;
Log::verbose("ServerLobby", "Started delay at %lf set delay to %lf",
StkTime::getRealTime(),
m_server_delay);
terminateLatencyProtocol(); terminateLatencyProtocol();
} }
m_client_ready_count.unlock(); m_client_ready_count.unlock();

View File

@ -43,8 +43,9 @@ private:
/** Keeps track of an artificial server delay (which makes sure that the /** Keeps track of an artificial server delay (which makes sure that the
* data from all clients has arrived when the server computes a certain * data from all clients has arrived when the server computes a certain
* timestep. */ * timestep.(. It stores the real time since epoch + delta (atm 0.1
float m_server_delay; * seconds), which is the real time at which the server should start. */
double m_server_delay;
Protocol *m_current_protocol; Protocol *m_current_protocol;
bool m_selection_enabled; bool m_selection_enabled;