mirror of
https://github.com/godotengine/godot.git
synced 2026-01-03 18:11:19 +03:00
[MP] Move engine and editor profilers to a plugin.
Also refactor the editor plugin out of the ReplicationEditor.
This commit is contained in:
@@ -39,89 +39,6 @@
|
||||
#include "core/object/script_language.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
class RemoteDebugger::MultiplayerProfiler : public EngineProfiler {
|
||||
struct BandwidthFrame {
|
||||
uint32_t timestamp;
|
||||
int packet_size;
|
||||
};
|
||||
|
||||
int bandwidth_in_ptr = 0;
|
||||
Vector<BandwidthFrame> bandwidth_in;
|
||||
int bandwidth_out_ptr = 0;
|
||||
Vector<BandwidthFrame> bandwidth_out;
|
||||
uint64_t last_bandwidth_time = 0;
|
||||
|
||||
int bandwidth_usage(const Vector<BandwidthFrame> &p_buffer, int p_pointer) {
|
||||
ERR_FAIL_COND_V(p_buffer.size() == 0, 0);
|
||||
int total_bandwidth = 0;
|
||||
|
||||
uint64_t timestamp = OS::get_singleton()->get_ticks_msec();
|
||||
uint64_t final_timestamp = timestamp - 1000;
|
||||
|
||||
int i = (p_pointer + p_buffer.size() - 1) % p_buffer.size();
|
||||
|
||||
while (i != p_pointer && p_buffer[i].packet_size > 0) {
|
||||
if (p_buffer[i].timestamp < final_timestamp) {
|
||||
return total_bandwidth;
|
||||
}
|
||||
total_bandwidth += p_buffer[i].packet_size;
|
||||
i = (i + p_buffer.size() - 1) % p_buffer.size();
|
||||
}
|
||||
|
||||
ERR_FAIL_COND_V_MSG(i == p_pointer, total_bandwidth, "Reached the end of the bandwidth profiler buffer, values might be inaccurate.");
|
||||
return total_bandwidth;
|
||||
}
|
||||
|
||||
public:
|
||||
void toggle(bool p_enable, const Array &p_opts) {
|
||||
if (!p_enable) {
|
||||
bandwidth_in.clear();
|
||||
bandwidth_out.clear();
|
||||
} else {
|
||||
bandwidth_in_ptr = 0;
|
||||
bandwidth_in.resize(16384); // ~128kB
|
||||
for (int i = 0; i < bandwidth_in.size(); ++i) {
|
||||
bandwidth_in.write[i].packet_size = -1;
|
||||
}
|
||||
bandwidth_out_ptr = 0;
|
||||
bandwidth_out.resize(16384); // ~128kB
|
||||
for (int i = 0; i < bandwidth_out.size(); ++i) {
|
||||
bandwidth_out.write[i].packet_size = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void add(const Array &p_data) {
|
||||
ERR_FAIL_COND(p_data.size() < 3);
|
||||
const String inout = p_data[0];
|
||||
int time = p_data[1];
|
||||
int size = p_data[2];
|
||||
if (inout == "in") {
|
||||
bandwidth_in.write[bandwidth_in_ptr].timestamp = time;
|
||||
bandwidth_in.write[bandwidth_in_ptr].packet_size = size;
|
||||
bandwidth_in_ptr = (bandwidth_in_ptr + 1) % bandwidth_in.size();
|
||||
} else if (inout == "out") {
|
||||
bandwidth_out.write[bandwidth_out_ptr].timestamp = time;
|
||||
bandwidth_out.write[bandwidth_out_ptr].packet_size = size;
|
||||
bandwidth_out_ptr = (bandwidth_out_ptr + 1) % bandwidth_out.size();
|
||||
}
|
||||
}
|
||||
|
||||
void tick(double p_frame_time, double p_process_time, double p_physics_time, double p_physics_frame_time) {
|
||||
uint64_t pt = OS::get_singleton()->get_ticks_msec();
|
||||
if (pt - last_bandwidth_time > 200) {
|
||||
last_bandwidth_time = pt;
|
||||
int incoming_bandwidth = bandwidth_usage(bandwidth_in, bandwidth_in_ptr);
|
||||
int outgoing_bandwidth = bandwidth_usage(bandwidth_out, bandwidth_out_ptr);
|
||||
|
||||
Array arr;
|
||||
arr.push_back(incoming_bandwidth);
|
||||
arr.push_back(outgoing_bandwidth);
|
||||
EngineDebugger::get_singleton()->send_message("multiplayer:bandwidth", arr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class RemoteDebugger::PerformanceProfiler : public EngineProfiler {
|
||||
Object *performance = nullptr;
|
||||
int last_perf_time = 0;
|
||||
@@ -659,10 +576,6 @@ RemoteDebugger::RemoteDebugger(Ref<RemoteDebuggerPeer> p_peer) {
|
||||
max_errors_per_second = GLOBAL_GET("network/limits/debugger/max_errors_per_second");
|
||||
max_warnings_per_second = GLOBAL_GET("network/limits/debugger/max_warnings_per_second");
|
||||
|
||||
// Multiplayer Profiler
|
||||
multiplayer_profiler.instantiate();
|
||||
multiplayer_profiler->bind("multiplayer");
|
||||
|
||||
// Performance Profiler
|
||||
Object *perf = Engine::get_singleton()->get_singleton_object("Performance");
|
||||
if (perf) {
|
||||
|
||||
@@ -50,10 +50,8 @@ public:
|
||||
private:
|
||||
typedef DebuggerMarshalls::OutputError ErrorMessage;
|
||||
|
||||
class MultiplayerProfiler;
|
||||
class PerformanceProfiler;
|
||||
|
||||
Ref<MultiplayerProfiler> multiplayer_profiler;
|
||||
Ref<PerformanceProfiler> performance_profiler;
|
||||
|
||||
Ref<RemoteDebuggerPeer> peer;
|
||||
|
||||
Reference in New Issue
Block a user