Qt: Improve FPS timer stability

This commit is contained in:
Vicki Pfau 2018-05-31 09:09:32 -07:00
parent 9ea438e1f0
commit 27ea14ea94
2 changed files with 25 additions and 7 deletions

View File

@ -138,11 +138,13 @@ Window::Window(CoreManager* manager, ConfigController* config, int playerId, QWi
connect(this, &Window::shutdown, m_logView, &QWidget::hide); connect(this, &Window::shutdown, m_logView, &QWidget::hide);
connect(&m_fpsTimer, &QTimer::timeout, this, &Window::showFPS); 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_focusCheck, &QTimer::timeout, this, &Window::focusCheck);
connect(&m_inputController, &InputController::profileLoaded, m_shortcutController, &ShortcutController::loadProfile); connect(&m_inputController, &InputController::profileLoaded, m_shortcutController, &ShortcutController::loadProfile);
m_log.setLevels(mLOG_WARN | mLOG_ERROR | mLOG_FATAL); m_log.setLevels(mLOG_WARN | mLOG_ERROR | mLOG_FATAL);
m_fpsTimer.setInterval(FPS_TIMER_INTERVAL); m_fpsTimer.setInterval(FPS_TIMER_INTERVAL);
m_frameTimer.setInterval(FRAME_LIST_INTERVAL);
m_focusCheck.setInterval(200); m_focusCheck.setInterval(200);
m_shortcutController->setConfigController(m_config); m_shortcutController->setConfigController(m_config);
@ -690,6 +692,7 @@ void Window::gameStarted() {
m_hitUnimplementedBiosCall = false; m_hitUnimplementedBiosCall = false;
if (m_config->getOption("showFps", "1").toInt()) { if (m_config->getOption("showFps", "1").toInt()) {
m_fpsTimer.start(); m_fpsTimer.start();
m_frameTimer.start();
} }
m_focusCheck.start(); m_focusCheck.start();
if (m_display->underMouse()) { if (m_display->underMouse()) {
@ -759,6 +762,7 @@ void Window::gameStopped() {
m_audioChannels->clear(); m_audioChannels->clear();
m_fpsTimer.stop(); m_fpsTimer.stop();
m_frameTimer.stop();
m_focusCheck.stop(); m_focusCheck.stop();
emit paused(false); emit paused(false);
@ -887,19 +891,27 @@ void Window::mustRestart() {
} }
void Window::recordFrame() { void Window::recordFrame() {
m_frameList.append(QDateTime::currentDateTime()); if (m_frameList.isEmpty()) {
while (m_frameList.count() > FRAME_LIST_SIZE) { m_frameList.append(1);
m_frameList.removeFirst(); } 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() { void Window::showFPS() {
if (m_frameList.isEmpty()) { if (m_frameList.isEmpty()) {
updateTitle(); updateTitle();
return; return;
} }
qint64 interval = m_frameList.first().msecsTo(m_frameList.last()); float fps = m_frameCounter * 10000.f / (FRAME_LIST_INTERVAL * (m_frameList.size() - 1));
float fps = (m_frameList.count() - 1) * 10000.f / interval;
fps = round(fps) / 10.f; fps = round(fps) / 10.f;
updateTitle(fps); updateTitle(fps);
} }
@ -1618,9 +1630,11 @@ void Window::setupMenu(QMenuBar* menubar) {
showFps->connect([this](const QVariant& value) { showFps->connect([this](const QVariant& value) {
if (!value.toInt()) { if (!value.toInt()) {
m_fpsTimer.stop(); m_fpsTimer.stop();
m_frameTimer.stop();
updateTitle(); updateTitle();
} else if (m_controller) { } else if (m_controller) {
m_fpsTimer.start(); m_fpsTimer.start();
m_frameTimer.start();
} }
}, this); }, this);

View File

@ -132,6 +132,7 @@ private slots:
void mustRestart(); void mustRestart();
void recordFrame(); void recordFrame();
void delimitFrames();
void showFPS(); void showFPS();
void focusCheck(); void focusCheck();
@ -139,7 +140,8 @@ private slots:
private: private:
static const int FPS_TIMER_INTERVAL = 2000; 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 setupMenu(QMenuBar*);
void openStateWindow(LoadSave); void openStateWindow(LoadSave);
@ -187,8 +189,10 @@ private:
QPixmap m_logo{":/res/mgba-1024.png"}; QPixmap m_logo{":/res/mgba-1024.png"};
ConfigController* m_config; ConfigController* m_config;
InputController m_inputController; InputController m_inputController;
QList<QDateTime> m_frameList; QList<int> m_frameList;
int m_frameCounter = 0;
QTimer m_fpsTimer; QTimer m_fpsTimer;
QTimer m_frameTimer;
QList<QString> m_mruFiles; QList<QString> m_mruFiles;
QMenu* m_mruMenu = nullptr; QMenu* m_mruMenu = nullptr;
QMenu* m_videoLayers; QMenu* m_videoLayers;