|
12 | 12 | #include "core/snapshot.h" |
13 | 13 | #include "core/var_data.h" |
14 | 14 | #include "data_buffer.h" |
15 | | -#include <chrono> |
16 | 15 | #include <limits> |
17 | 16 | #include <string> |
18 | 17 | #include <vector> |
@@ -67,12 +66,6 @@ void SceneSynchronizerBase::setup(SynchronizerManager &p_synchronizer_interface) |
67 | 66 | [this](int p_peer) { on_peer_connected(p_peer); }, |
68 | 67 | [this](int p_peer) { on_peer_disconnected(p_peer); }); |
69 | 68 |
|
70 | | - rpc_handler_latency = |
71 | | - network_interface->rpc_config( |
72 | | - std::function<void()>(std::bind(&SceneSynchronizerBase::rpc_latency, this)), |
73 | | - true, |
74 | | - false); |
75 | | - |
76 | 69 | rpc_handler_state = |
77 | 70 | network_interface->rpc_config( |
78 | 71 | std::function<void(DataBuffer &)>(std::bind(&SceneSynchronizerBase::rpc_receive_state, this, std::placeholders::_1)), |
@@ -1092,18 +1085,6 @@ void SceneSynchronizerBase::notify_controller_control_mode_changed(PeerNetworked |
1092 | 1085 | } |
1093 | 1086 | } |
1094 | 1087 |
|
1095 | | -void SceneSynchronizerBase::rpc_latency() { |
1096 | | - if (is_client()) { |
1097 | | - // This is a client, latency the server back. |
1098 | | - rpc_handler_latency.rpc(get_network_interface(), get_network_interface().get_server_peer()); |
1099 | | - } else if (is_server()) { |
1100 | | - const int sender_peer = get_network_interface().rpc_get_sender(); |
1101 | | - static_cast<ServerSynchronizer *>(synchronizer)->notify_latency_received(sender_peer); |
1102 | | - } else { |
1103 | | - ENSURE_MSG(false, "[FATAL] The rpc latency function was executed on a peer that is not a client nor a server. This is a bug."); |
1104 | | - } |
1105 | | -} |
1106 | | - |
1107 | 1088 | void SceneSynchronizerBase::rpc_receive_state(DataBuffer &p_snapshot) { |
1108 | 1089 | ENSURE_MSG(is_client(), "Only clients are suposed to receive the server snapshot."); |
1109 | 1090 | static_cast<ClientSynchronizer *>(synchronizer)->receive_snapshot(p_snapshot); |
@@ -1732,7 +1713,7 @@ void ServerSynchronizer::process(double p_delta) { |
1732 | 1713 | } |
1733 | 1714 |
|
1734 | 1715 | process_trickled_sync(p_delta); |
1735 | | - process_latency_update(); |
| 1716 | + update_peers_net_statistics(p_delta); |
1736 | 1717 | process_adjust_clients_controller_tick_rate(p_delta); |
1737 | 1718 |
|
1738 | 1719 | SceneSynchronizerDebugger::singleton()->scene_sync_process_end(scene_synchronizer); |
@@ -2368,46 +2349,29 @@ void ServerSynchronizer::process_trickled_sync(double p_delta) { |
2368 | 2349 | memdelete(tmp_buffer); |
2369 | 2350 | } |
2370 | 2351 |
|
2371 | | -void ServerSynchronizer::process_latency_update() { |
2372 | | - const std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now(); |
2373 | | - |
| 2352 | +void ServerSynchronizer::update_peers_net_statistics(double p_delta) { |
2374 | 2353 | for (auto &[peer, peer_data] : scene_synchronizer->get_peers()) { |
2375 | 2354 | if (peer == scene_synchronizer->get_network_interface().fetch_local_peer_id()) { |
2376 | 2355 | // No need to update the ping for `self` (the server). |
2377 | 2356 | continue; |
2378 | 2357 | } |
2379 | 2358 |
|
2380 | 2359 | std::map<int, PeerServerData>::iterator peer_server_data_it = NS::MapFunc::insert_if_new(peers_data, peer, PeerServerData()); |
2381 | | - if (peer_server_data_it->second.latency_calculation_in_progress) { |
| 2360 | + peer_server_data_it->second.netstats_update_sec += p_delta; |
| 2361 | + |
| 2362 | + if make_likely (peer_server_data_it->second.netstats_update_sec < scene_synchronizer->latency_update_rate) { |
2382 | 2363 | continue; |
2383 | 2364 | } |
2384 | | - const auto interval = std::chrono::duration_cast<std::chrono::milliseconds>(now - peer_server_data_it->second.latency_ping_timestamp); |
2385 | | - if (interval.count() >= (scene_synchronizer->latency_update_rate * 1000.0)) { |
2386 | | - scene_synchronizer->rpc_handler_latency.rpc( |
2387 | | - scene_synchronizer->get_network_interface(), |
2388 | | - peer); |
2389 | | - peer_server_data_it->second.latency_ping_timestamp = now; |
2390 | | - peer_server_data_it->second.latency_calculation_in_progress = true; |
2391 | | - } |
2392 | | - } |
2393 | | -} |
2394 | 2365 |
|
2395 | | -void ServerSynchronizer::notify_latency_received(int p_peer) { |
2396 | | - const std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now(); |
2397 | | - |
2398 | | - std::map<int, PeerData>::iterator pd_it = NS::MapFunc::insert_if_new(scene_synchronizer->peer_data, p_peer, PeerData()); |
2399 | | - std::map<int, PeerServerData>::iterator psd_it = NS::MapFunc::insert_if_new(peers_data, p_peer, PeerServerData()); |
2400 | | - |
2401 | | - const auto rtt_interval = std::chrono::duration_cast<std::chrono::milliseconds>(now - psd_it->second.latency_ping_timestamp); |
2402 | | - // Clamlatency to 1k as 1k ms latency is way too high to matter anyway. |
2403 | | - const std::uint64_t rtt = rtt_interval.count(); |
2404 | | - pd_it->second.set_latency(rtt); |
2405 | | - psd_it->second.latency_calculation_in_progress = false; |
2406 | | - psd_it->second.latency_ping_timestamp = now; |
| 2366 | + // Time to update the network stats for this peer. |
| 2367 | + scene_synchronizer->get_network_interface().server_update_net_stats(peer, peer_data); |
| 2368 | + // Notify all sync groups about this peer having newly calculated latency. |
| 2369 | + for (auto &group : sync_groups) { |
| 2370 | + group.notify_peer_has_newly_calculated_latency(peer); |
| 2371 | + } |
2407 | 2372 |
|
2408 | | - // Notify all sync groups about this peer having newly calculated latency. |
2409 | | - for (auto &group : sync_groups) { |
2410 | | - group.notify_peer_has_newly_calculated_latency(p_peer); |
| 2373 | + // Reset the timer. |
| 2374 | + peer_server_data_it->second.netstats_update_sec = 0.0; |
2411 | 2375 | } |
2412 | 2376 | } |
2413 | 2377 |
|
|
0 commit comments