From c64608355c62aea9785ededdd18f8e4ee95d6c68 Mon Sep 17 00:00:00 2001 From: chiguireitor Date: Tue, 28 Apr 2020 13:01:08 -0400 Subject: [PATCH 1/4] Added packet stat tracking for Enet peer --- .../doc_classes/NetworkedMultiplayerENet.xml | 36 ++++++++++++++++++ modules/enet/networked_multiplayer_enet.cpp | 37 +++++++++++++++++++ modules/enet/networked_multiplayer_enet.h | 11 ++++++ 3 files changed, 84 insertions(+) diff --git a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml index 1ba0ee659fc8..3debbe785d68 100644 --- a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml +++ b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml @@ -104,6 +104,42 @@ The IP used when creating a server. This is set to the wildcard [code]"*"[/code] by default, which binds to all available interfaces. The given IP needs to be in IPv4 or IPv6 address format, for example: [code]"192.168.1.1"[/code]. + + + + + Get the number of packets sent since the last clear. + + + + + + + Get the number of packets received since the last clear. + + + + + + + Get the number of bytes sent since the last clear. + + + + + + + Get the number of bytes received since the last clear. + + + + + + + Clear the packet sent/received stats. + + + diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index ca134824f7f9..221f3f2d6ddb 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -525,6 +525,9 @@ Error NetworkedMultiplayerENet::get_packet(const uint8_t **r_buffer, int &r_buff *r_buffer = (const uint8_t *)(¤t_packet.packet->data[8]); r_buffer_size = current_packet.packet->dataLength - 8; + this->num_packets_received++; + this->num_bytes_received += current_packet.packet->dataLength - 8; + return OK; } @@ -570,6 +573,9 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer, int p_buffer encode_uint32(target_peer, &packet->data[4]); // Dest ID copymem(&packet->data[8], p_buffer, p_buffer_size); + this->num_packets_sent++; + this->num_bytes_sent += p_buffer_size; + if (server) { if (target_peer == 0) { @@ -847,6 +853,29 @@ bool NetworkedMultiplayerENet::is_server_relay_enabled() const { return server_relay; } +uint32_t NetworkedMultiplayerENet::get_num_packets_received() const { + return num_packets_received; +} + +uint32_t NetworkedMultiplayerENet::get_num_bytes_received() const { + return num_bytes_received; +} + +uint32_t NetworkedMultiplayerENet::get_num_packets_sent() const { + return num_packets_sent; +} + +uint32_t NetworkedMultiplayerENet::get_num_bytes_sent() const { + return num_bytes_sent; +} + +void NetworkedMultiplayerENet::clear_packet_stats() { + num_packets_received = 0; + num_bytes_received = 0; + num_packets_sent = 0; + num_bytes_sent = 0; +} + void NetworkedMultiplayerENet::_bind_methods() { ClassDB::bind_method(D_METHOD("create_server", "port", "max_clients", "in_bandwidth", "out_bandwidth"), &NetworkedMultiplayerENet::create_server, DEFVAL(32), DEFVAL(0), DEFVAL(0)); @@ -870,6 +899,12 @@ void NetworkedMultiplayerENet::_bind_methods() { ClassDB::bind_method(D_METHOD("set_server_relay_enabled", "enabled"), &NetworkedMultiplayerENet::set_server_relay_enabled); ClassDB::bind_method(D_METHOD("is_server_relay_enabled"), &NetworkedMultiplayerENet::is_server_relay_enabled); + ClassDB::bind_method(D_METHOD("get_num_packets_received"), &NetworkedMultiplayerENet::get_num_packets_received); + ClassDB::bind_method(D_METHOD("get_num_bytes_received"), &NetworkedMultiplayerENet::get_num_bytes_received); + ClassDB::bind_method(D_METHOD("get_num_packets_sent"), &NetworkedMultiplayerENet::get_num_packets_sent); + ClassDB::bind_method(D_METHOD("get_num_bytes_sent"), &NetworkedMultiplayerENet::get_num_bytes_sent); + ClassDB::bind_method(D_METHOD("clear_packet_stats"), &NetworkedMultiplayerENet::clear_packet_stats); + ADD_PROPERTY(PropertyInfo(Variant::INT, "compression_mode", PROPERTY_HINT_ENUM, "None,Range Coder,FastLZ,ZLib,ZStd"), "set_compression_mode", "get_compression_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "transfer_channel"), "set_transfer_channel", "get_transfer_channel"); ADD_PROPERTY(PropertyInfo(Variant::INT, "channel_count"), "set_channel_count", "get_channel_count"); @@ -904,6 +939,8 @@ NetworkedMultiplayerENet::NetworkedMultiplayerENet() { enet_compressor.destroy = enet_compressor_destroy; bind_ip = IP_Address("*"); + + clear_packet_stats(); } NetworkedMultiplayerENet::~NetworkedMultiplayerENet() { diff --git a/modules/enet/networked_multiplayer_enet.h b/modules/enet/networked_multiplayer_enet.h index 11487b99a5dd..c19df05326e7 100644 --- a/modules/enet/networked_multiplayer_enet.h +++ b/modules/enet/networked_multiplayer_enet.h @@ -73,6 +73,11 @@ class NetworkedMultiplayerENet : public NetworkedMultiplayerPeer { int channel_count; bool always_ordered; + uint32_t num_packets_received; + uint32_t num_bytes_received; + uint32_t num_packets_sent; + uint32_t num_bytes_sent; + ENetEvent event; ENetPeer *peer; ENetHost *host; @@ -162,6 +167,12 @@ class NetworkedMultiplayerENet : public NetworkedMultiplayerPeer { void set_server_relay_enabled(bool p_enabled); bool is_server_relay_enabled() const; + uint32_t get_num_packets_received() const; + uint32_t get_num_bytes_received() const; + uint32_t get_num_packets_sent() const; + uint32_t get_num_bytes_sent() const; + void clear_packet_stats(); + NetworkedMultiplayerENet(); ~NetworkedMultiplayerENet(); From d2b5f494c5237a7a6b0ae915d3aaaebc0ab22080 Mon Sep 17 00:00:00 2001 From: chiguireitor Date: Tue, 28 Apr 2020 13:17:03 -0400 Subject: [PATCH 2/4] Added methods to enable packet tracking (disabled by default) --- .../doc_classes/NetworkedMultiplayerENet.xml | 17 +++++++++++++- modules/enet/networked_multiplayer_enet.cpp | 23 +++++++++++++++---- modules/enet/networked_multiplayer_enet.h | 3 +++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml index 3debbe785d68..0d5ed3f948c2 100644 --- a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml +++ b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml @@ -139,7 +139,22 @@ Clear the packet sent/received stats. - + + + + + + + Enable or disable packet statistics tracking. + + + + + + + Return if packet statistics tracking is enabled. + + diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index 221f3f2d6ddb..7a05eab772bb 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -525,8 +525,10 @@ Error NetworkedMultiplayerENet::get_packet(const uint8_t **r_buffer, int &r_buff *r_buffer = (const uint8_t *)(¤t_packet.packet->data[8]); r_buffer_size = current_packet.packet->dataLength - 8; - this->num_packets_received++; - this->num_bytes_received += current_packet.packet->dataLength - 8; + if (track_packet_stats) { + num_packets_received++; + num_bytes_received += current_packet.packet->dataLength - 8; + } return OK; } @@ -573,8 +575,10 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer, int p_buffer encode_uint32(target_peer, &packet->data[4]); // Dest ID copymem(&packet->data[8], p_buffer, p_buffer_size); - this->num_packets_sent++; - this->num_bytes_sent += p_buffer_size; + if (track_packet_stats) { + num_packets_sent++; + num_bytes_sent += p_buffer_size; + } if (server) { @@ -876,6 +880,14 @@ void NetworkedMultiplayerENet::clear_packet_stats() { num_bytes_sent = 0; } +void NetworkedMultiplayerENet::set_track_packet_stats(bool p_enable) { + track_packet_stats = p_enable; +} + +bool NetworkedMultiplayerENet::is_track_packet_stats_enabled() { + return track_packet_stats; +} + void NetworkedMultiplayerENet::_bind_methods() { ClassDB::bind_method(D_METHOD("create_server", "port", "max_clients", "in_bandwidth", "out_bandwidth"), &NetworkedMultiplayerENet::create_server, DEFVAL(32), DEFVAL(0), DEFVAL(0)); @@ -904,6 +916,8 @@ void NetworkedMultiplayerENet::_bind_methods() { ClassDB::bind_method(D_METHOD("get_num_packets_sent"), &NetworkedMultiplayerENet::get_num_packets_sent); ClassDB::bind_method(D_METHOD("get_num_bytes_sent"), &NetworkedMultiplayerENet::get_num_bytes_sent); ClassDB::bind_method(D_METHOD("clear_packet_stats"), &NetworkedMultiplayerENet::clear_packet_stats); + ClassDB::bind_method(D_METHOD("set_track_packet_stats"), &NetworkedMultiplayerENet::set_track_packet_stats); + ClassDB::bind_method(D_METHOD("is_track_packet_stats_enabled"), &NetworkedMultiplayerENet::is_track_packet_stats_enabled); ADD_PROPERTY(PropertyInfo(Variant::INT, "compression_mode", PROPERTY_HINT_ENUM, "None,Range Coder,FastLZ,ZLib,ZStd"), "set_compression_mode", "get_compression_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "transfer_channel"), "set_transfer_channel", "get_transfer_channel"); @@ -940,6 +954,7 @@ NetworkedMultiplayerENet::NetworkedMultiplayerENet() { bind_ip = IP_Address("*"); + track_packet_stats = false; clear_packet_stats(); } diff --git a/modules/enet/networked_multiplayer_enet.h b/modules/enet/networked_multiplayer_enet.h index c19df05326e7..b9f8936e9536 100644 --- a/modules/enet/networked_multiplayer_enet.h +++ b/modules/enet/networked_multiplayer_enet.h @@ -77,6 +77,7 @@ class NetworkedMultiplayerENet : public NetworkedMultiplayerPeer { uint32_t num_bytes_received; uint32_t num_packets_sent; uint32_t num_bytes_sent; + bool track_packet_stats; ENetEvent event; ENetPeer *peer; @@ -172,6 +173,8 @@ class NetworkedMultiplayerENet : public NetworkedMultiplayerPeer { uint32_t get_num_packets_sent() const; uint32_t get_num_bytes_sent() const; void clear_packet_stats(); + void set_track_packet_stats(bool p_enable); + bool is_track_packet_stats_enabled(); NetworkedMultiplayerENet(); ~NetworkedMultiplayerENet(); From c33aacc846b1539eeb8de4a8ee4d271d2dba2d79 Mon Sep 17 00:00:00 2001 From: chiguireitor Date: Wed, 29 Apr 2020 17:03:10 -0400 Subject: [PATCH 3/4] Fixed tracking of received stats --- modules/enet/networked_multiplayer_enet.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index 7a05eab772bb..af8e82e62c0f 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -355,6 +355,11 @@ void NetworkedMultiplayerENet::poll() { uint32_t *id = (uint32_t *)event.peer->data; ERR_CONTINUE(event.packet->dataLength < 8); + + if (track_packet_stats) { + num_packets_received++; + num_bytes_received += event.packet->dataLength - 8; + } uint32_t source = decode_uint32(&event.packet->data[0]); int target = decode_uint32(&event.packet->data[4]); @@ -525,11 +530,6 @@ Error NetworkedMultiplayerENet::get_packet(const uint8_t **r_buffer, int &r_buff *r_buffer = (const uint8_t *)(¤t_packet.packet->data[8]); r_buffer_size = current_packet.packet->dataLength - 8; - if (track_packet_stats) { - num_packets_received++; - num_bytes_received += current_packet.packet->dataLength - 8; - } - return OK; } From b4e7a18fc775a4b0905b446cb98dba5190d010a2 Mon Sep 17 00:00:00 2001 From: chiguireitor Date: Thu, 30 Apr 2020 02:11:24 -0400 Subject: [PATCH 4/4] Removed extra whitespace to appease the clang rules check --- modules/enet/networked_multiplayer_enet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index af8e82e62c0f..efcae417e864 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -355,7 +355,7 @@ void NetworkedMultiplayerENet::poll() { uint32_t *id = (uint32_t *)event.peer->data; ERR_CONTINUE(event.packet->dataLength < 8); - + if (track_packet_stats) { num_packets_received++; num_bytes_received += event.packet->dataLength - 8;