From a30d031a9c7c6f52c52c90512d5a03e9d533395d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 15 Mar 2021 11:34:09 +1100 Subject: [PATCH] improved FPS counter Shows real frame update time rather than refresh time --- app/widget/viewer/viewer.cpp | 8 +++-- app/widget/viewer/viewerdisplay.cpp | 47 ++++++++++++++++++++--------- app/widget/viewer/viewerdisplay.h | 13 +++++--- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 3dbd0e83e..f16f9793f 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -428,9 +428,12 @@ void ViewerWidget::UpdateTextureFromNode(const rational& time) PopOldestFrameFromPlaybackQueue(); if (popped) { // We've already popped a frame in this loop, meaning a frame has been skipped - display_widget_->SetSkippedFrames(display_widget_->GetSkippedFrames()+1); + display_widget_->IncrementSkippedFrames(); + } else { + // Shown a frame and progressed to the next one + display_widget_->IncrementFrameCount(); + popped = true; } - popped = true; } } @@ -492,7 +495,6 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only) playback_speed_ = speed; play_in_to_out_only_ = in_to_out_only; - display_widget_->SetSkippedFrames(0); playback_queue_next_frame_ = ruler()->GetTime(); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 7af1a1f64..192059b5a 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -55,6 +55,9 @@ ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) : // Initializes cursor based on tool UpdateCursor(); + + const int kFrameRateAverageCount = 8; + frame_rate_averages_.resize(kFrameRateAverageCount); } ViewerDisplayWidget::~ViewerDisplayWidget() @@ -187,6 +190,8 @@ void ViewerDisplayWidget::ResetFPSTimer() { fps_timer_start_ = QDateTime::currentMSecsSinceEpoch(); fps_timer_update_count_ = 0; + frames_skipped_ = 0; + frame_rate_average_count_ = 0; } void ViewerDisplayWidget::mousePressEvent(QMouseEvent *event) @@ -357,22 +362,36 @@ void ViewerDisplayWidget::OnPaint() p.drawLines(lines, 2); } - fps_timer_update_count_++; if (show_fps_) { - QPainter p(inner_widget()); - qint64 now = QDateTime::currentMSecsSinceEpoch(); - double frame_rate; - if (now == fps_timer_start_) { - // This will cause a divide by zero, so we do nothing here - frame_rate = 0; - } else { - frame_rate = double(fps_timer_update_count_) / double((now - fps_timer_start_)/1000.0); - } - DrawTextWithCrudeShadow(&p, inner_widget()->rect(), tr("%1 FPS").arg(QString::number(frame_rate, 'f', 2))); + { + qint64 now = QDateTime::currentMSecsSinceEpoch(); + double frame_rate; + if (now == fps_timer_start_) { + // This will cause a divide by zero, so we do nothing here + frame_rate = 0; + } else { + frame_rate = double(fps_timer_update_count_) / double((now - fps_timer_start_)/1000.0); + } - if (frames_skipped_ > 0) { - DrawTextWithCrudeShadow(&p, inner_widget()->rect().adjusted(0, p.fontMetrics().height(), 0, 0), - tr("%1 frames skipped").arg(frames_skipped_)); + frame_rate_averages_[frame_rate_average_count_%frame_rate_averages_.size()] = frame_rate; + frame_rate_average_count_++; + } + + if (frame_rate_average_count_ >= frame_rate_averages_.size()) { + QPainter p(inner_widget()); + + double average = 0.0; + for (int i=0; irect(), tr("%1 FPS").arg(QString::number(average, 'f', 1))); + + if (frames_skipped_ > 0) { + DrawTextWithCrudeShadow(&p, inner_widget()->rect().adjusted(0, p.fontMetrics().height(), 0, 0), + tr("%1 frames skipped").arg(frames_skipped_)); + } } } } diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 20b75a06f..e00af4af9 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -91,14 +91,14 @@ public: return show_fps_; } - int GetSkippedFrames() const + void IncrementSkippedFrames() { - return frames_skipped_; + frames_skipped_++; } - void SetSkippedFrames(int i) + void IncrementFrameCount() { - frames_skipped_ = i; + fps_timer_update_count_++; } public slots: @@ -268,11 +268,14 @@ private: bool deinterlace_; qint64 fps_timer_start_; - qint64 fps_timer_update_count_; + int fps_timer_update_count_; bool show_fps_; int frames_skipped_; + QVector frame_rate_averages_; + int frame_rate_average_count_; + private slots: void EmitColorAtCursor(QMouseEvent* e);