Change clock to system clock, fix bugs

This commit is contained in:
Vladislav Khorev 2026-01-17 13:59:02 +03:00
parent f967807296
commit e0a60dcd6f
4 changed files with 28 additions and 27 deletions

View File

@ -40,7 +40,7 @@ class Session : public std::enable_shared_from_this<Session> {
ClientState state_;
void process_message(const std::string& msg) {
auto now_server = std::chrono::steady_clock::now();
auto now_server = std::chrono::system_clock::now();
// Ïðåäïîëîæèì ôîðìàò ñîîáùåíèé:
// ROT:ANGLE:MAG:TIMESTAMP
@ -65,7 +65,7 @@ class Session : public std::enable_shared_from_this<Session> {
if (deltaMs > 0) state_.simulate_physics(deltaMs);
std::chrono::steady_clock::time_point uptime_timepoint{ std::chrono::duration_cast<std::chrono::steady_clock::time_point::duration>(std::chrono::milliseconds(clientTimestamp)) };
std::chrono::system_clock::time_point uptime_timepoint{ std::chrono::duration_cast<std::chrono::system_clock::time_point::duration>(std::chrono::milliseconds(clientTimestamp)) };
state_.lastUpdateServerTime = uptime_timepoint;
@ -73,6 +73,7 @@ class Session : public std::enable_shared_from_this<Session> {
if (parts[0] == "ROT") {
state_.discreteAngle = std::stoi(parts[2]);
state_.discreteMag = std::stof(parts[3]);
std::cout << "ROT id = " << this->id_ << " discreteMag=" << state_.discreteMag << std::endl;
state_.apply_lag_compensation(now_server);
state_.lastUpdateServerTime = now_server;
retranslateMessage(msg);
@ -85,6 +86,7 @@ class Session : public std::enable_shared_from_this<Session> {
}
else if (parts[0] == "PING") {
state_.handle_full_sync(parts);
std::cout << "PING id = " << this->id_ <<" discreteMag=" << state_.discreteMag << std::endl;
state_.apply_lag_compensation(now_server);
state_.lastUpdateServerTime = now_server;
}
@ -110,7 +112,7 @@ public:
void init()
{
state_.lastUpdateServerTime = std::chrono::steady_clock::now();
state_.lastUpdateServerTime = std::chrono::system_clock::now();
}
std::string get_state_string() {
@ -133,7 +135,7 @@ public:
});
}
void tick_physics_global(std::chrono::steady_clock::time_point now) {
void tick_physics_global(std::chrono::system_clock::time_point now) {
long long deltaMs = 0;
// Åñëè ýòî ñàìûé ïåðâûé òèê, ïðîñòî çàïîìèíàåì âðåìÿ
@ -181,7 +183,7 @@ private:
};
void update_world(net::steady_timer& timer, net::io_context& ioc) {
auto now = std::chrono::steady_clock::now();
auto now = std::chrono::system_clock::now();
{
std::lock_guard<std::mutex> lock(g_sessions_mutex);
@ -196,7 +198,7 @@ void update_world(net::steady_timer& timer, net::io_context& ioc) {
last_broadcast = now;
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()
std::chrono::system_clock::now().time_since_epoch()
).count();
// Ñîáèðàåì äàííûå âñåõ èãðîêîâ â îäèí ïàêåò

View File

@ -242,7 +242,7 @@ namespace ZL
if (newVel != Environment::shipSelectedVelocity) {
Environment::shipSelectedVelocity = newVel;
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()
std::chrono::system_clock::now().time_since_epoch()
).count();
std::string msg = "VEL:" + std::to_string(now_ms) + ":" + std::to_string(Environment::shipSelectedVelocity);
networkClient->Send(msg);
@ -634,7 +634,7 @@ namespace ZL
if (pingTimer >= 1000.0f) {
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()
std::chrono::system_clock::now().time_since_epoch()
).count();
// 1. Извлекаем кватернион из матрицы поворота
@ -707,12 +707,14 @@ namespace ZL
int discreteAngle = static_cast<int>(radians * 180.0f / M_PI);
if (discreteAngle < 0) discreteAngle += 360;
std::cout << "OUTPUT discreteAngle=" << discreteAngle << std::endl;
// 3. Проверяем, изменились ли параметры значимо для отправки на сервер
if (discreteAngle != Environment::lastSentAngle || discreteMag != Environment::lastSentMagnitude) {
Environment::lastSentAngle = discreteAngle;
Environment::lastSentMagnitude = discreteMag;
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()
std::chrono::system_clock::now().time_since_epoch()
).count();
// Формируем сетевой пакет
@ -776,7 +778,7 @@ namespace ZL
Environment::lastSentAngle = discreteAngle;
Environment::lastSentMagnitude = discreteMag;
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()
std::chrono::system_clock::now().time_since_epoch()
).count();
// Формируем сетевой пакет
@ -809,7 +811,7 @@ namespace ZL
}
}
std::cout << "shipVelocity=" << Environment::shipVelocity << " delta=" << delta << std::endl;
//std::cout << "shipVelocity=" << Environment::shipVelocity << " delta=" << delta << std::endl;
// Движение вперед (существующая логика)
if (fabs(Environment::shipVelocity) > 0.01f)
{
@ -1102,7 +1104,7 @@ namespace ZL
void Game::extrapolateRemotePlayers() {
auto now = std::chrono::steady_clock::now();
auto now = std::chrono::system_clock::now();
latestRemotePlayers = networkClient->getRemotePlayers();

View File

@ -24,7 +24,7 @@ struct ClientState {
int discreteAngle = -1;
// Для расчета лага
std::chrono::steady_clock::time_point lastUpdateServerTime;
std::chrono::system_clock::time_point lastUpdateServerTime;
void simulate_physics(size_t delta) {
// Константы из Game.cpp, приведенные к секундам (умножаем на 1000)
@ -87,6 +87,10 @@ struct ClientState {
Eigen::Quaternionf rotateQuat(Eigen::AngleAxisf(deltaAlpha, axis));
rotation = rotation * rotateQuat.toRotationMatrix();
//std::cout << "Rotating ship. d="<< delta <<" DeltaAlpha: " << deltaAlpha << ", Axis: [" << axis.x() << ", " << axis.y() << ", " << axis.z() << "]\n";
}
else {
//std::cout << "NOT Rotating ship. speedScale=" << speedScale << " discreteMag=" << discreteMag << "\n";
}
/*
@ -154,7 +158,6 @@ struct ClientState {
velocity = shipDesiredVelocity;
}
}
std::cout << "velocity=" << velocity << " delta=" << delta << std::endl;
if (fabs(velocity) > 0.01f)
{
@ -164,16 +167,7 @@ struct ClientState {
}
}
void apply_lag_compensation(std::chrono::steady_clock::time_point nowTime) {
// 1. Получаем текущее время сервера в той же шкале (мс)
/*uto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()
).count();
long long deltaMs = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch() - lastUpdateServerTime
).count();*/
void apply_lag_compensation(std::chrono::system_clock::time_point nowTime) {
// 2. Вычисляем задержку
long long deltaMs = 0;

View File

@ -69,7 +69,7 @@ namespace ZL {
void WebSocketClient::Poll() {
std::lock_guard<std::mutex> lock(queueMutex);
auto nowTime = std::chrono::steady_clock::now();
auto nowTime = std::chrono::system_clock::now();
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
nowTime.time_since_epoch()
@ -98,6 +98,7 @@ namespace ZL {
rp.discreteAngle = std::stoi(parts[4]);
rp.discreteMag = std::stof(parts[5]);
}
std::cout << "EVENT Received discreteMag=" << rp.discreteMag << std::endl;
// --- ÊÎÌÏÅÍÑÀÖÈß ËÀÃÀ ---
// Âû÷èñëÿåì çàäåðæêó â ñåêóíäàõ
@ -160,9 +161,11 @@ namespace ZL {
rp.velocity = std::stof(vals[8]);
rp.currentAngularVelocity = { std::stof(vals[9]), std::stof(vals[10]), std::stof(vals[11]) };
rp.selectedVelocity = std::stoi(vals[12]);
rp.discreteMag = std::stoi(vals[13]);
rp.discreteMag = std::stof(vals[13]);
rp.discreteAngle = std::stoi(vals[14]);
std::chrono::steady_clock::time_point uptime_timepoint{ std::chrono::duration_cast<std::chrono::steady_clock::time_point::duration>(std::chrono::milliseconds(serverTime)) };
std::chrono::system_clock::time_point uptime_timepoint{ std::chrono::duration_cast<std::chrono::system_clock::time_point::duration>(std::chrono::milliseconds(serverTime)) };
std::cout << "PING Received discreteMag=" << rp.discreteMag << std::endl;
rp.lastUpdateServerTime = uptime_timepoint;