From d8a07b6ea2bf63cff54afd348dee53cc46b33145 Mon Sep 17 00:00:00 2001 From: dP Date: Fri, 5 Dec 2025 17:57:58 +0500 Subject: [PATCH] Measure map download and loading times and send them to the server --- src/network/network_client.cpp | 10 ++++++++++ src/network/network_client.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index ec3bdf353c..8a9b7a83ce 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -426,6 +426,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGetMap() return NETWORK_RECV_STATUS_OKAY; } +static uint32_t u32_duration(const std::chrono::steady_clock::time_point &begin, const std::chrono::steady_clock::time_point &end) { + auto ms = std::chrono::duration_cast(end - begin).count(); + return ClampTo(ms); +} + /** Tell the server we received the complete map. */ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk() { @@ -435,6 +440,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk() my_client->status = STATUS_ACTIVE; auto p = std::make_unique(PACKET_CLIENT_MAP_OK); + p->Send_uint32(u32_duration(my_client->cm_map_begin, my_client->cm_map_done)); + p->Send_uint32(u32_duration(my_client->cm_map_done, my_client->cm_map_loaded)); my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -838,6 +845,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe if (this->savegame != nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET; + this->cm_map_begin = std::chrono::steady_clock::now(); this->savegame = std::make_shared(); _frame_counter = _frame_counter_server = _frame_counter_max = p.Recv_uint32(); @@ -894,11 +902,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); this->savegame->Reset(); + this->cm_map_done = std::chrono::steady_clock::now(); /* The map is done downloading, load it */ ClearErrorMessages(); bool load_success = SafeLoad({}, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, this->savegame); this->savegame = nullptr; + this->cm_map_loaded = std::chrono::steady_clock::now(); /* Long savegame loads shouldn't affect the lag calculation! */ this->last_packet = std::chrono::steady_clock::now(); diff --git a/src/network/network_client.h b/src/network/network_client.h index d314ddc41a..3ddef51cc7 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -35,6 +35,10 @@ private: ServerStatus status; ///< Status of the connection with the server. + std::chrono::steady_clock::time_point cm_map_begin; + std::chrono::steady_clock::time_point cm_map_done; + std::chrono::steady_clock::time_point cm_map_loaded; + protected: friend void NetworkExecuteLocalCommandQueue(); friend void NetworkClose(bool close_admins);