From 21cae91890caca4a1c17e2e1e1acb0948747bba0 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 26 Nov 2022 21:43:41 +0100 Subject: [PATCH] pstats: Fix hovering strip chart labels being excessively slow Now properly uses the cached data rather than computing it on every mouseover --- pandatool/src/pstatserver/pStatStripChart.cxx | 52 +++++++++---------- pandatool/src/pstatserver/pStatStripChart.h | 4 +- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/pandatool/src/pstatserver/pStatStripChart.cxx b/pandatool/src/pstatserver/pStatStripChart.cxx index 4f278d996e..e0859dd965 100644 --- a/pandatool/src/pstatserver/pStatStripChart.cxx +++ b/pandatool/src/pstatserver/pStatStripChart.cxx @@ -333,20 +333,20 @@ get_label_tooltip(int collector_index) const { double now = _time_width + _start_time; double then = now - pstats_average_time; - double net_value = 0.0f; - double net_time = 0.0f; + double net_value = 0.0; + double net_time = 0.0; // We start with just the portion of frame then_i that actually does fall // within our "then to now" window (usually some portion of it will). const PStatFrameData &frame_data = thread_data->get_frame(then_i); if (frame_data.get_end() > then) { double this_time = (frame_data.get_end() - then); - _view.set_to_frame(frame_data); - - const PStatViewLevel *level = _view.get_level(collector_index); - if (level != nullptr) { - net_value += level->get_net_value() * this_time; - net_time += this_time; + for (const ColorData &cd : get_frame_data(then_i)) { + if (cd._collector_index == collector_index) { + net_value += cd._net_value * this_time; + net_time += this_time; + break; + } } } // Then we get all of each of the remaining frames. @@ -354,13 +354,13 @@ get_label_tooltip(int collector_index) const { frame_number <= now_i; frame_number++) { const PStatFrameData &frame_data = thread_data->get_frame(frame_number); - double this_time = frame_data.get_net_time(); - _view.set_to_frame(frame_data); - - const PStatViewLevel *level = _view.get_level(collector_index); - if (level != nullptr) { - net_value += level->get_net_value() * this_time; - net_time += this_time; + for (const ColorData &cd : get_frame_data(frame_number)) { + if (cd._collector_index == collector_index) { + double this_time = frame_data.get_net_time(); + net_value += cd._net_value * this_time; + net_time += this_time; + break; + } } } @@ -543,7 +543,7 @@ scale_frame_data(FrameData &fdata, double factor) { * the chart. */ const PStatStripChart::FrameData &PStatStripChart:: -get_frame_data(int frame_number) { +get_frame_data(int frame_number) const { Data::const_iterator di; di = _data.find(frame_number); if (di != _data.end()) { @@ -578,7 +578,7 @@ get_frame_data(int frame_number) { fdata.push_back(cd); } - inc_label_usage(fdata); + ((PStatStripChart *)this)->inc_label_usage(fdata); return fdata; } @@ -649,13 +649,10 @@ compute_average_pixel_data(PStatStripChart::FrameData &result, */ double PStatStripChart:: get_net_value(int frame_number) const { - const FrameData &frame = - ((PStatStripChart *)this)->get_frame_data(frame_number); + const FrameData &frame = get_frame_data(frame_number); double net_value = 0.0; - FrameData::const_iterator fi; - for (fi = frame.begin(); fi != frame.end(); ++fi) { - const ColorData &cd = (*fi); + for (const ColorData &cd : frame) { net_value += cd._net_value; } @@ -671,7 +668,7 @@ get_average_net_value() const { const PStatThreadData *thread_data = _view.get_thread_data(); int now_i, then_i; if (!thread_data->get_elapsed_frames(then_i, now_i)) { - return 0.0f; + return 0.0; } double now = _time_width + _start_time; double then = now - pstats_average_time; @@ -698,13 +695,14 @@ get_average_net_value() const { const PStatThreadData *thread_data = _view.get_thread_data(); - double net_value = 0.0f; - double net_time = 0.0f; + double net_value = 0.0; + double net_time = 0.0; // We start with just the portion of frame then_i that actually does fall // within our "then to now" window (usually some portion of it will). - if (thread_data->get_frame(then_i).get_end() > then) { - double this_time = (thread_data->get_frame(then_i).get_end() - then); + const PStatFrameData &frame_data = thread_data->get_frame(then_i); + if (frame_data.get_end() > then) { + double this_time = (frame_data.get_end() - then); net_value += get_net_value(then_i) * this_time; net_time += this_time; } diff --git a/pandatool/src/pstatserver/pStatStripChart.h b/pandatool/src/pstatserver/pStatStripChart.h index 25ed47fb39..abfcd1ec99 100644 --- a/pandatool/src/pstatserver/pStatStripChart.h +++ b/pandatool/src/pstatserver/pStatStripChart.h @@ -91,7 +91,7 @@ protected: const FrameData &additional, double weight); static void scale_frame_data(FrameData &fdata, double factor); - const FrameData &get_frame_data(int frame_number); + const FrameData &get_frame_data(int frame_number) const; void compute_average_pixel_data(PStatStripChart::FrameData &result, int &then_i, int &now_i, double now); double get_net_value(int frame_number) const; @@ -132,7 +132,7 @@ private: bool _scroll_mode; bool _average_mode; - Data _data; + mutable Data _data; int _next_frame; bool _first_data;