116 lines
4.4 KiB
C++
116 lines
4.4 KiB
C++
#include "Performance_Shower_p.h"
|
|
namespace YSG {
|
|
using PerformanceShower_Binding = Renderable_Binding<Performance_Shower, Performance_Shower_Private, Performance_Shower_Render_State, PerformanceShowerInputData>;
|
|
Performance_Shower::Performance_Shower() {
|
|
PerformanceShower_Binding::init(this, "PerformanceShower");
|
|
set_independent_pixel_cache(true);
|
|
}
|
|
Performance_Shower_Private* Performance_Shower::d() {
|
|
return PerformanceShower_Binding::d(this);
|
|
}
|
|
Render_Data* Performance_Shower::create_render_data() {
|
|
return PerformanceShower_Binding::create_render_data();
|
|
}
|
|
Render_State* Performance_Shower::create_render_state() {
|
|
return PerformanceShower_Binding::create_render_state();
|
|
}
|
|
Input_Data* Performance_Shower::create_input_data() {
|
|
return PerformanceShower_Binding::create_input_data();
|
|
}
|
|
void Performance_Shower::setEnabled(bool enabled) {
|
|
mEnabled.store(enabled, std::memory_order_release);
|
|
if (enabled) {
|
|
append_event({Performance_Event_Type::Clear});
|
|
}
|
|
mark_render_dirty();
|
|
}
|
|
bool Performance_Shower::enabled() const {
|
|
return mEnabled.load(std::memory_order_acquire);
|
|
}
|
|
void Performance_Shower::refresh_counter() {
|
|
append_event({Performance_Event_Type::Clear});
|
|
}
|
|
void Performance_Shower::counter_increase(const QString& counterName) {
|
|
increment_counter("General", counterName);
|
|
}
|
|
void Performance_Shower::increment_counter(const QString& scope, const QString& name) {
|
|
Performance_Event event;
|
|
event.type = Performance_Event_Type::Counter;
|
|
event.scope = scope;
|
|
event.key = name;
|
|
append_event(event);
|
|
}
|
|
void Performance_Shower::set_performance_line(const QString& key, const Performance_Line& line) {
|
|
Performance_Event event;
|
|
event.type = Performance_Event_Type::Line;
|
|
event.scope = "General";
|
|
event.key = key;
|
|
event.line = line;
|
|
append_event(event);
|
|
}
|
|
void Performance_Shower::set_info(const QString& key, const QString& value) {
|
|
set_state("General", key, value);
|
|
}
|
|
void Performance_Shower::set_state(const QString& scope, const QString& name, const QString& value) {
|
|
Performance_Event event;
|
|
event.type = Performance_Event_Type::State;
|
|
event.scope = scope;
|
|
event.key = name;
|
|
event.value = value;
|
|
append_event(event);
|
|
}
|
|
void Performance_Shower::set_gauge(const QString& scope, const QString& name, double value) {
|
|
Performance_Event event;
|
|
event.type = Performance_Event_Type::Gauge;
|
|
event.scope = scope;
|
|
event.key = name;
|
|
event.number = value;
|
|
append_event(event);
|
|
}
|
|
void Performance_Shower::record_cost(const QString& key, double value) {
|
|
record_duration("General", key, value);
|
|
}
|
|
void Performance_Shower::record_duration(const QString& scope, const QString& name, double value) {
|
|
Performance_Event event;
|
|
event.type = Performance_Event_Type::Duration;
|
|
event.scope = scope;
|
|
event.key = name;
|
|
event.number = value;
|
|
append_event(event);
|
|
}
|
|
void Performance_Shower::set_view_filter(const QString& name) {
|
|
set_view_filter(name, {});
|
|
}
|
|
void Performance_Shower::set_view_filter(const QString& group, const QString& name) {
|
|
Performance_Event event;
|
|
event.type = Performance_Event_Type::SelectView;
|
|
event.scope = group;
|
|
event.key = name;
|
|
append_event(event);
|
|
}
|
|
void Performance_Shower::scroll_view(int lines) {
|
|
Performance_Event event;
|
|
event.type = Performance_Event_Type::ScrollView;
|
|
event.number = lines;
|
|
append_event(event);
|
|
}
|
|
void Performance_Shower::append_event(const Performance_Event& event) {
|
|
if (!enabled() && event.type != Performance_Event_Type::Clear) return;
|
|
auto pd = d();
|
|
Render_Input_Lease<Performance_Shower_Private, PerformanceShowerInputData> input(pd, false);
|
|
input->events.append(event);
|
|
notify_observed_update(event.type == Performance_Event_Type::Clear || event.type == Performance_Event_Type::SelectView || event.type == Performance_Event_Type::ScrollView);
|
|
}
|
|
void Performance_Shower::notify_observed_update(bool force) {
|
|
std::uint64_t now = static_cast<std::uint64_t>(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count());
|
|
std::uint64_t last = mLastNotifyNs.load(std::memory_order_acquire);
|
|
if (!force && now - last < 100000000) return;
|
|
if (force) {
|
|
mLastNotifyNs.store(now, std::memory_order_release);
|
|
mark_render_dirty();
|
|
return;
|
|
}
|
|
if (force || mLastNotifyNs.compare_exchange_strong(last, now, std::memory_order_acq_rel, std::memory_order_acquire)) mark_render_dirty();
|
|
}
|
|
}
|