diff --git a/include/core/GodotGlobal.hpp b/include/core/GodotGlobal.hpp index a1c62f2..71b3cf6 100644 --- a/include/core/GodotGlobal.hpp +++ b/include/core/GodotGlobal.hpp @@ -25,6 +25,8 @@ public: static void nativescript_init(void *handle); static void nativescript_terminate(void *handle); + static void gdnative_profiling_add_data(const char *p_signature, uint64_t p_time); + template static void print(const String &fmt, Args... values) { print(fmt.format(Array::make(values...))); diff --git a/include/core/GodotProfiling.hpp b/include/core/GodotProfiling.hpp new file mode 100644 index 0000000..0862d0b --- /dev/null +++ b/include/core/GodotProfiling.hpp @@ -0,0 +1,34 @@ +#ifndef GODOT_PROFILING_HPP +#define GODOT_PROFILING_HPP + +#include "OS.hpp" + + +namespace godot { + +class FunctionProfiling { + char signature[1024]; + uint64_t ticks; + +public: + FunctionProfiling(const char *p_function, const int p_line) { + snprintf(signature, 1024, "::%d::%s", p_line, p_function); + ticks = OS::get_singleton()->get_ticks_usec(); + } + ~FunctionProfiling() { + uint64_t t = OS::get_singleton()->get_ticks_usec() - ticks; + if (t > 0) { + Godot::gdnative_profiling_add_data(signature, t); + } + } +}; + +} + +#ifdef DEBUG_ENABLED +#define GODOT_PROFILING_FUNCTION FunctionProfiling __function_profiling(__FUNCTION__, __LINE__); +#else +#define GODOT_PROFILING_FUNCTION +#endif + +#endif diff --git a/src/core/GodotGlobal.cpp b/src/core/GodotGlobal.cpp index 23054cf..ba984a8 100644 --- a/src/core/GodotGlobal.cpp +++ b/src/core/GodotGlobal.cpp @@ -97,6 +97,10 @@ void Godot::gdnative_terminate(godot_gdnative_terminate_options *options) { // reserved for future use. } +void Godot::gdnative_profiling_add_data(const char *p_signature, uint64_t p_time) { + godot::nativescript_1_1_api->godot_nativescript_profiling_add_data(p_signature, p_time); +} + void Godot::nativescript_init(void *handle) { godot::_RegisterState::nativescript_handle = handle;