Permalink
Browse files

Qt: Improve FPS timer stability

  • Loading branch information...
endrift committed May 31, 2018
1 parent 9ea438e commit 27ea14ea94f9b83d9cfd5dead6ca60c538a4d748
Showing with 25 additions and 7 deletions.
  1. +19 −5 src/platform/qt/Window.cpp
  2. +6 −2 src/platform/qt/Window.h
View
@@ -138,11 +138,13 @@ Window::Window(CoreManager* manager, ConfigController* config, int playerId, QWi
connect(this, &Window::shutdown, m_logView, &QWidget::hide);
connect(&m_fpsTimer, &QTimer::timeout, this, &Window::showFPS);
+ connect(&m_frameTimer, &QTimer::timeout, this, &Window::delimitFrames);
connect(&m_focusCheck, &QTimer::timeout, this, &Window::focusCheck);
connect(&m_inputController, &InputController::profileLoaded, m_shortcutController, &ShortcutController::loadProfile);
m_log.setLevels(mLOG_WARN | mLOG_ERROR | mLOG_FATAL);
m_fpsTimer.setInterval(FPS_TIMER_INTERVAL);
+ m_frameTimer.setInterval(FRAME_LIST_INTERVAL);
m_focusCheck.setInterval(200);
m_shortcutController->setConfigController(m_config);
@@ -690,6 +692,7 @@ void Window::gameStarted() {
m_hitUnimplementedBiosCall = false;
if (m_config->getOption("showFps", "1").toInt()) {
m_fpsTimer.start();
+ m_frameTimer.start();
}
m_focusCheck.start();
if (m_display->underMouse()) {
@@ -759,6 +762,7 @@ void Window::gameStopped() {
m_audioChannels->clear();
m_fpsTimer.stop();
+ m_frameTimer.stop();
m_focusCheck.stop();
emit paused(false);
@@ -887,19 +891,27 @@ void Window::mustRestart() {
}
void Window::recordFrame() {
- m_frameList.append(QDateTime::currentDateTime());
- while (m_frameList.count() > FRAME_LIST_SIZE) {
- m_frameList.removeFirst();
+ if (m_frameList.isEmpty()) {
+ m_frameList.append(1);
+ } else {
+ ++m_frameList.back();
+ }
+}
+
+void Window::delimitFrames() {
+ if (m_frameList.size() >= FRAME_LIST_SIZE) {
+ m_frameCounter -= m_frameList.takeAt(0);
}
+ m_frameCounter += m_frameList.back();
+ m_frameList.append(0);
}
void Window::showFPS() {
if (m_frameList.isEmpty()) {
updateTitle();
return;
}
- qint64 interval = m_frameList.first().msecsTo(m_frameList.last());
- float fps = (m_frameList.count() - 1) * 10000.f / interval;
+ float fps = m_frameCounter * 10000.f / (FRAME_LIST_INTERVAL * (m_frameList.size() - 1));
fps = round(fps) / 10.f;
updateTitle(fps);
}
@@ -1618,9 +1630,11 @@ void Window::setupMenu(QMenuBar* menubar) {
showFps->connect([this](const QVariant& value) {
if (!value.toInt()) {
m_fpsTimer.stop();
+ m_frameTimer.stop();
updateTitle();
} else if (m_controller) {
m_fpsTimer.start();
+ m_frameTimer.start();
}
}, this);
View
@@ -132,14 +132,16 @@ private slots:
void mustRestart();
void recordFrame();
+ void delimitFrames();
void showFPS();
void focusCheck();
void updateFrame();
private:
static const int FPS_TIMER_INTERVAL = 2000;
- static const int FRAME_LIST_SIZE = 120;
+ static const int FRAME_LIST_INTERVAL = 100;
+ static const int FRAME_LIST_SIZE = 40;
void setupMenu(QMenuBar*);
void openStateWindow(LoadSave);
@@ -187,8 +189,10 @@ private slots:
QPixmap m_logo{":/res/mgba-1024.png"};
ConfigController* m_config;
InputController m_inputController;
- QList<QDateTime> m_frameList;
+ QList<int> m_frameList;
+ int m_frameCounter = 0;
QTimer m_fpsTimer;
+ QTimer m_frameTimer;
QList<QString> m_mruFiles;
QMenu* m_mruMenu = nullptr;
QMenu* m_videoLayers;

0 comments on commit 27ea14e

Please sign in to comment.