#pragma once #include "tsdk/TrackEngineTypes.h" #include namespace tsdk { namespace profiler { struct ProfilerImpl; /** @brief Profiler class - storage for all ScopeTimers and statistics. */ struct Profiler { static Profiler& getInstance() { static Profiler profiler; return profiler; } bool isEnabled() const; void setEnabled(bool enable); void pushTimer(const char *timerName); void profileTime(const char *timerName, size_t duration); void outputProfileData(); void outputBuffersState(const char *filename); void storeBufferState(const char *bufferName, tsdk::FrameId frame, size_t bufferSize); private: Profiler(); ~Profiler(); ProfilerImpl *m_pimpl; }; struct BufferLog { /** @brief saves state of buffer for given frame number * @param bufferName to save info for it * @param frame to which save info * @param bufferSize current number of items in buffer */ static void logBufferState(const char *bufferName, tsdk::FrameId frame, size_t bufferSize); /** @brief saves info about buffers to json file with given filename * @param filename */ static void outputState(const char *filename); }; /** @brief ScopedTimer class with nesting and storing statistics */ struct ScopedTimer { /** @brief Constructor * @param name name for timing interval */ TRACK_ENGINE_API explicit ScopedTimer(const char *name); TRACK_ENGINE_API ~ScopedTimer(); ScopedTimer(ScopedTimer &) = delete; ScopedTimer(ScopedTimer &&) = delete; ScopedTimer &operator=(ScopedTimer &) = delete; ScopedTimer &operator=(ScopedTimer &&) = delete; /** @brief output timing storage data to log */ static void outputProfileData(); private: using clock = std::chrono::high_resolution_clock; using time_point_type = std::chrono::high_resolution_clock::time_point; char m_name[1024]; time_point_type m_start; }; } }