From 95be1a4aab1110de1b511ae9b617e72008c27efe Mon Sep 17 00:00:00 2001 From: Kung-vr Date: Sat, 2 Feb 2019 03:01:36 +0900 Subject: [PATCH] Prevent low vsync fps from slowing tick under old 20ms --- src/overlaycontroller.cpp | 11 +++++++++++ src/overlaycontroller.h | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 7b00181..3f884b5 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -540,7 +540,18 @@ void OverlayController::OnTimeoutPumpEvents() // wait for the next frame after executing our main event loop once. m_lastFrame = m_currentFrame; + m_vsyncTooLateCounter = 0; } + else if ( m_vsyncTooLateCounter >= k_nonVsyncTickRate ) + { + mainEventLoop(); + // m_lastFrame = m_currentFrame + 1 skips the next vsync frame in case + // it was just about to trigger, to prevent double updates faster than + // 11ms. + m_lastFrame = m_currentFrame + 1; + m_vsyncTooLateCounter = 0; + } + m_vsyncTooLateCounter++; } void OverlayController::mainEventLoop() diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h index 8c1b6d4..2f89486 100644 --- a/src/overlaycontroller.h +++ b/src/overlaycontroller.h @@ -58,6 +58,9 @@ constexpr int k_reviveSettingsUpdateCounter = 139; constexpr int k_settingsTabSettingsUpdateCounter = 157; constexpr int k_steamVrSettingsUpdateCounter = 97; constexpr int k_utilitiesSettingsUpdateCounter = 19; +// k_nonVsyncTickRate determines number of ms we wait to force the next event +// loop tick when vsync is too late due to dropped frames. +constexpr int k_nonVsyncTickRate = 20; class OverlayController : public QObject { @@ -102,6 +105,7 @@ private: uint64_t m_currentFrame = 0; uint64_t m_lastFrame = 0; + int m_vsyncTooLateCounter = 0; // OpenVR_Init must be declared before any other class that uses OpenVR // function calls since objects are initialized in order of declaration in