improved FPS counter

Shows real frame update time rather than refresh time
This commit is contained in:
itsmattkc
2021-03-15 11:34:09 +11:00
parent 056a1202d6
commit a30d031a9c
3 changed files with 46 additions and 22 deletions
+5 -3
View File
@@ -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();
+33 -14
View File
@@ -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; i<frame_rate_averages_.size(); i++) {
average += frame_rate_averages_[i];
}
average /= double(frame_rate_averages_.size());
DrawTextWithCrudeShadow(&p, inner_widget()->rect(), 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_));
}
}
}
}
+8 -5
View File
@@ -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<double> frame_rate_averages_;
int frame_rate_average_count_;
private slots:
void EmitColorAtCursor(QMouseEvent* e);