mirror of
https://github.com/vcmi/vcmi.git
synced 2025-04-21 12:06:49 +02:00
Switch turn timers handling to boost asio timer
This commit is contained in:
parent
0196707083
commit
aa7ecea683
@ -30,6 +30,7 @@ class DLL_LINKAGE INetworkServerListener : public INetworkConnectionListener
|
|||||||
friend class NetworkServer;
|
friend class NetworkServer;
|
||||||
protected:
|
protected:
|
||||||
virtual void onNewConnection(const std::shared_ptr<NetworkConnection> &) = 0;
|
virtual void onNewConnection(const std::shared_ptr<NetworkConnection> &) = 0;
|
||||||
|
virtual void onTimer() = 0;
|
||||||
|
|
||||||
~INetworkServerListener() = default;
|
~INetworkServerListener() = default;
|
||||||
};
|
};
|
||||||
@ -38,9 +39,9 @@ class DLL_LINKAGE INetworkClientListener : public INetworkConnectionListener
|
|||||||
{
|
{
|
||||||
friend class NetworkClient;
|
friend class NetworkClient;
|
||||||
protected:
|
protected:
|
||||||
virtual void onTimer() = 0;
|
|
||||||
virtual void onConnectionFailed(const std::string & errorMessage) = 0;
|
virtual void onConnectionFailed(const std::string & errorMessage) = 0;
|
||||||
virtual void onConnectionEstablished(const std::shared_ptr<NetworkConnection> &) = 0;
|
virtual void onConnectionEstablished(const std::shared_ptr<NetworkConnection> &) = 0;
|
||||||
|
virtual void onTimer() = 0;
|
||||||
|
|
||||||
~INetworkClientListener() = default;
|
~INetworkClientListener() = default;
|
||||||
};
|
};
|
||||||
|
@ -80,4 +80,14 @@ void NetworkServer::onPacketReceived(const std::shared_ptr<NetworkConnection> &
|
|||||||
listener.onPacketReceived(connection, message);
|
listener.onPacketReceived(connection, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetworkServer::setTimer(std::chrono::milliseconds duration)
|
||||||
|
{
|
||||||
|
auto timer = std::make_shared<NetworkTimer>(*io, duration);
|
||||||
|
timer->async_wait([this, timer](const boost::system::error_code& error){
|
||||||
|
if (!error)
|
||||||
|
listener.onTimer();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -34,6 +34,7 @@ public:
|
|||||||
|
|
||||||
void sendPacket(const std::shared_ptr<NetworkConnection> &, const std::vector<uint8_t> & message);
|
void sendPacket(const std::shared_ptr<NetworkConnection> &, const std::vector<uint8_t> & message);
|
||||||
void closeConnection(const std::shared_ptr<NetworkConnection> &);
|
void closeConnection(const std::shared_ptr<NetworkConnection> &);
|
||||||
|
void setTimer(std::chrono::milliseconds duration);
|
||||||
|
|
||||||
void start(uint16_t port);
|
void start(uint16_t port);
|
||||||
void run(std::chrono::milliseconds duration);
|
void run(std::chrono::milliseconds duration);
|
||||||
|
@ -107,6 +107,11 @@ void LobbyServer::sendMessage(const std::shared_ptr<NetworkConnection> & target,
|
|||||||
networkServer->sendPacket(target, payloadBuffer);
|
networkServer->sendPacket(target, payloadBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LobbyServer::onTimer()
|
||||||
|
{
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
void LobbyServer::onNewConnection(const std::shared_ptr<NetworkConnection> & connection)
|
void LobbyServer::onNewConnection(const std::shared_ptr<NetworkConnection> & connection)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ class LobbyServer : public INetworkServerListener
|
|||||||
void onNewConnection(const std::shared_ptr<NetworkConnection> &) override;
|
void onNewConnection(const std::shared_ptr<NetworkConnection> &) override;
|
||||||
void onDisconnected(const std::shared_ptr<NetworkConnection> &) override;
|
void onDisconnected(const std::shared_ptr<NetworkConnection> &) override;
|
||||||
void onPacketReceived(const std::shared_ptr<NetworkConnection> &, const std::vector<uint8_t> & message) override;
|
void onPacketReceived(const std::shared_ptr<NetworkConnection> &, const std::vector<uint8_t> & message) override;
|
||||||
|
void onTimer() override;
|
||||||
|
|
||||||
void sendMessage(const std::shared_ptr<NetworkConnection> & target, const JsonNode & json);
|
void sendMessage(const std::shared_ptr<NetworkConnection> & target, const JsonNode & json);
|
||||||
public:
|
public:
|
||||||
|
@ -236,29 +236,29 @@ void CVCMIServer::run()
|
|||||||
vmHelper.callStaticVoidMethod(CAndroidVMHelper::NATIVE_METHODS_DEFAULT_CLASS, "onServerReady");
|
vmHelper.callStaticVoidMethod(CAndroidVMHelper::NATIVE_METHODS_DEFAULT_CLASS, "onServerReady");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
networkServer->run();
|
||||||
static const int serverUpdateIntervalMilliseconds = 50;
|
|
||||||
auto clockInitial = std::chrono::steady_clock::now();
|
|
||||||
int64_t msPassedLast = 0;
|
|
||||||
|
|
||||||
while(state != EServerState::SHUTDOWN)
|
|
||||||
{
|
|
||||||
networkServer->run(std::chrono::milliseconds(serverUpdateIntervalMilliseconds));
|
|
||||||
|
|
||||||
const auto clockNow = std::chrono::steady_clock::now();
|
|
||||||
const auto clockPassed = clockNow - clockInitial;
|
|
||||||
const int64_t msPassedNow = std::chrono::duration_cast<std::chrono::milliseconds>(clockPassed).count();
|
|
||||||
const int64_t msDelta = msPassedNow - msPassedLast;
|
|
||||||
msPassedLast = msPassedNow;
|
|
||||||
|
|
||||||
if (state == EServerState::GAMEPLAY)
|
|
||||||
gh->tick(msDelta);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVCMIServer::onTimer()
|
void CVCMIServer::onTimer()
|
||||||
{
|
{
|
||||||
// FIXME: move GameHandler updates here
|
if (state != EServerState::GAMEPLAY)
|
||||||
|
return;
|
||||||
|
|
||||||
|
static const auto serverUpdateInterval = std::chrono::milliseconds(100);
|
||||||
|
|
||||||
|
auto timeNow = std::chrono::steady_clock::now();
|
||||||
|
auto timePassedBefore = lastTimerUpdateTime - gameplayStartTime;
|
||||||
|
auto timePassedNow = timeNow - gameplayStartTime;
|
||||||
|
|
||||||
|
lastTimerUpdateTime = timeNow;
|
||||||
|
|
||||||
|
auto msPassedBefore = std::chrono::duration_cast<std::chrono::milliseconds>(timePassedBefore);
|
||||||
|
auto msPassedNow = std::chrono::duration_cast<std::chrono::milliseconds>(timePassedNow);
|
||||||
|
auto msDelta = msPassedNow - msPassedBefore;
|
||||||
|
|
||||||
|
if (msDelta.count())
|
||||||
|
gh->tick(msDelta.count());
|
||||||
|
networkServer->setTimer(serverUpdateInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVCMIServer::establishOutgoingConnection()
|
void CVCMIServer::establishOutgoingConnection()
|
||||||
@ -372,6 +372,8 @@ void CVCMIServer::startGameImmediately()
|
|||||||
|
|
||||||
gh->start(si->mode == StartInfo::LOAD_GAME);
|
gh->start(si->mode == StartInfo::LOAD_GAME);
|
||||||
state = EServerState::GAMEPLAY;
|
state = EServerState::GAMEPLAY;
|
||||||
|
lastTimerUpdateTime = gameplayStartTime = std::chrono::steady_clock::now();
|
||||||
|
onTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVCMIServer::onDisconnected(const std::shared_ptr<NetworkConnection> & connection)
|
void CVCMIServer::onDisconnected(const std::shared_ptr<NetworkConnection> & connection)
|
||||||
|
@ -55,6 +55,9 @@ class CVCMIServer : public LobbyInfo, public INetworkServerListener, public INet
|
|||||||
/// Outgoing connection established by this server to game lobby for proxy mode (only in lobby game)
|
/// Outgoing connection established by this server to game lobby for proxy mode (only in lobby game)
|
||||||
std::unique_ptr<NetworkClient> outgoingConnection;
|
std::unique_ptr<NetworkClient> outgoingConnection;
|
||||||
|
|
||||||
|
std::chrono::steady_clock::time_point gameplayStartTime;
|
||||||
|
std::chrono::steady_clock::time_point lastTimerUpdateTime;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// List of all active connections
|
/// List of all active connections
|
||||||
std::vector<std::shared_ptr<CConnection>> activeConnections;
|
std::vector<std::shared_ptr<CConnection>> activeConnections;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user