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())
{
signalRaceStartToClients();
m_server_delay = 0.1f;
m_client_ready_count.getData() = 0;
}
m_client_ready_count.unlock();
@ -249,9 +248,10 @@ void ServerLobby::update(float dt)
// next state.
break;
case DELAY_SERVER:
m_server_delay -= dt;
if (m_server_delay < 0)
if (m_server_delay < StkTime::getRealTime())
{
Log::verbose("ServerLobby", "End delay at %lf",
StkTime::getRealTime());
m_state = RACING;
World::getWorld()->setReadyToRace();
}
@ -350,7 +350,8 @@ void ServerLobby::registerServer()
*/
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();
NetworkString *ns = getNetworkString(1);
ns->addUInt8(LE_START_RACE);
@ -935,12 +936,16 @@ void ServerLobby::finishedLoadingWorldClient(Event *event)
void ServerLobby::startedRaceOnClient(Event *event)
{
m_client_ready_count.lock();
Log::verbose("ServerLobby", "Host %d has started race.",
event->getPeer()->getHostId());
Log::verbose("ServerLobby", "Host %d has started race at %lf.",
event->getPeer()->getHostId(), StkTime::getRealTime());
m_client_ready_count.getData()++;
if (m_client_ready_count.getData() == m_game_setup->getPlayerCount())
{
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();
}
m_client_ready_count.unlock();

View File

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