diff --git a/profiler_gui/common_types.h b/profiler_gui/common_types.h index 9a7b815..57e6010 100644 --- a/profiler_gui/common_types.h +++ b/profiler_gui/common_types.h @@ -426,7 +426,7 @@ template inline bool is_max(const T& _value) { inline double percentReal(::profiler::timestamp_t _partial, ::profiler::timestamp_t _total) { - return 100. * static_cast(_partial) / static_cast(_total); + return _total ? 100. * static_cast(_partial) / static_cast(_total) : 0.; } inline int percent(::profiler::timestamp_t _partial, ::profiler::timestamp_t _total) diff --git a/profiler_gui/easy_graphics_scrollbar.cpp b/profiler_gui/easy_graphics_scrollbar.cpp index a2ec8e7..34455e0 100644 --- a/profiler_gui/easy_graphics_scrollbar.cpp +++ b/profiler_gui/easy_graphics_scrollbar.cpp @@ -234,6 +234,7 @@ EasyHystogramItem::EasyHystogramItem() : Parent(nullptr) , m_maxDuration(0) , m_minDuration(0) , m_timer(::std::bind(&This::onTimeout, this)) + , m_pProfilerThread(nullptr) , m_threadId(0) , m_blockId(::profiler_gui::numeric_max()) , m_timeouts(0) @@ -450,10 +451,12 @@ void EasyHystogramItem::paintByPtr(QPainter* _painter) _painter->setPen(Qt::black); rect.setRect(0, bottom + 2, width, widget->defaultFontHeight()); - _painter->drawText(rect, Qt::AlignHCenter | Qt::TextDontClip, QString("%1 | duration: %2 | active time: %3 (%4%)").arg(m_threadName) + _painter->drawText(rect, Qt::AlignHCenter | Qt::TextDontClip, QString("%1 | duration: %2 | active time: %3 (%4%) | %5 blocks (%6 events)").arg(m_threadName) .arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, m_threadDuration)) .arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, m_threadActiveTime)) - .arg(QString::number(100. * (double)m_threadActiveTime / (double)m_threadDuration, 'f', 2))); + .arg(m_threadDuration ? QString::number(100. * (double)m_threadActiveTime / (double)m_threadDuration, 'f', 2) : QString("0")) + .arg(m_pProfilerThread->blocks_number) + .arg(m_pProfilerThread->events.size())); _painter->drawText(rect, Qt::AlignLeft, bindMode ? " MODE: zoom" : " MODE: overview"); @@ -669,7 +672,7 @@ void EasyHystogramItem::paintById(QPainter* _painter) { _painter->drawText(rect, Qt::AlignHCenter | Qt::TextDontClip, QString("%1 | %2 | %3 calls | %4% of thread active time").arg(m_threadName).arg(name) .arg(item->tree.per_thread_stats->calls_number) - .arg(QString::number(100. * (double)item->tree.per_thread_stats->total_duration / (double)m_threadActiveTime, 'f', 2))); + .arg(m_threadActiveTime ? QString::number(100. * (double)item->tree.per_thread_stats->total_duration / (double)m_threadActiveTime, 'f', 2) : QString("100"))); } else { @@ -750,6 +753,7 @@ void EasyHystogramItem::setSource(::profiler::thread_id_t _thread_id, const ::pr if (m_pSource == nullptr) { + m_pProfilerThread = nullptr; m_maxDurationStr.clear(); m_minDurationStr.clear(); m_threadName.clear(); @@ -769,6 +773,8 @@ void EasyHystogramItem::setSource(::profiler::thread_id_t _thread_id, const ::pr m_threadDuration = easyBlock(root.children.back()).tree.node->end() - easyBlock(root.children.front()).tree.node->begin(); m_threadActiveTime = root.active_time; + m_pProfilerThread = &root; + m_timeUnits = EASY_GLOBALS.time_units; m_maxDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_maxDuration, 3); m_minDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_minDuration, 3); @@ -818,6 +824,8 @@ void EasyHystogramItem::setSource(::profiler::thread_id_t _thread_id, ::profiler m_threadDuration = easyBlock(root.children.back()).tree.node->end() - easyBlock(root.children.front()).tree.node->begin(); m_threadActiveTime = root.active_time; + m_pProfilerThread = &root; + show(); m_timeUnits = EASY_GLOBALS.time_units; m_bReady.store(false, ::std::memory_order_release); @@ -902,6 +910,7 @@ void EasyHystogramItem::setSource(::profiler::thread_id_t _thread_id, ::profiler } else { + m_pProfilerThread = nullptr; m_threadName.clear(); hide(); } diff --git a/profiler_gui/easy_graphics_scrollbar.h b/profiler_gui/easy_graphics_scrollbar.h index f89e3b1..9eab867 100644 --- a/profiler_gui/easy_graphics_scrollbar.h +++ b/profiler_gui/easy_graphics_scrollbar.h @@ -147,6 +147,7 @@ class EasyHystogramItem : public QGraphicsItem ::profiler::timestamp_t m_threadActiveTime; const ::profiler_gui::EasyItems* m_pSource; QImage* m_temporaryImage; + const ::profiler::BlocksTreeRoot* m_pProfilerThread; ::profiler::thread_id_t m_threadId; ::profiler::block_index_t m_blockId; int m_timeouts; diff --git a/profiler_gui/tree_widget_loader.cpp b/profiler_gui/tree_widget_loader.cpp index 390b417..83064ea 100644 --- a/profiler_gui/tree_widget_loader.cpp +++ b/profiler_gui/tree_widget_loader.cpp @@ -518,8 +518,9 @@ size_t FillTreeClass::setTreeInternal(T& _safelocker, Items& _items, const :: const auto& per_parent_stats = child.per_parent_stats; const auto& per_frame_stats = child.per_frame_stats; - auto percentage = duration == 0 ? 0 : ::profiler_gui::percent(duration, _parent->duration()); - auto percentage_sum = ::profiler_gui::percent(per_parent_stats->total_duration, _parent->duration()); + auto parent_duration = _parent->duration(); + auto percentage = duration == 0 ? 0 : ::profiler_gui::percent(duration, parent_duration); + auto percentage_sum = ::profiler_gui::percent(per_parent_stats->total_duration, parent_duration); item->setData(COL_PERCENT_PER_PARENT, Qt::UserRole, percentage); item->setText(COL_PERCENT_PER_PARENT, QString::number(percentage)); item->setData(COL_PERCENT_SUM_PER_PARENT, Qt::UserRole, percentage_sum); @@ -529,8 +530,9 @@ size_t FillTreeClass::setTreeInternal(T& _safelocker, Items& _items, const :: { if (_parent != _frame) { - percentage = duration == 0 ? 0 : ::profiler_gui::percent(duration, _frame->duration()); - percentage_sum = ::profiler_gui::percent(per_frame_stats->total_duration, _frame->duration()); + parent_duration = _frame->duration(); + percentage = duration == 0 ? 0 : ::profiler_gui::percent(duration, parent_duration); + percentage_sum = ::profiler_gui::percent(per_frame_stats->total_duration, parent_duration); } item->setData(COL_PERCENT_PER_FRAME, Qt::UserRole, percentage);