Unify FPS and V-Sync controls and behavior (#181)

- DirectX's "Match Refresh Rate" is now a checkbox like in OpenGL and Metal.
- Clamp max FPS to refresh rate when V-Sync is enabled or can't be disabled, regardless of the FPS sliders setting, to avoid slowdown in Metal / OpenGL and dropping frames in DirectX as much as possible.
-FPS slider allows up to 360 FPS in every renderer.
- More descriptive V-Sync tooltip

Also fixes GetInterpolationFPS() not being used to calculate desired FPS.

Co-authored-by: Lywx <kiritodev01@gmail.com>
This commit is contained in:
Spodi
2025-03-28 23:33:09 +01:00
committed by GitHub
parent 71de55d3bd
commit 28bda618b8
2 changed files with 22 additions and 40 deletions
+7 -7
View File
@@ -480,7 +480,7 @@ void GameEngine::ProcessGfxCommands(Gfx* commands) {
wnd->SetRendererUCode(UcodeHandlers::ucode_f3dex);
std::vector<std::unordered_map<Mtx*, MtxF>> mtx_replacements;
int target_fps = CVarGetInteger("gInterpolationFPS", 60);
int target_fps = GameEngine::Instance->GetInterpolationFPS();
static int last_fps;
static int last_update_rate;
static int time;
@@ -526,16 +526,16 @@ void GameEngine::ProcessGfxCommands(Gfx* commands) {
}
uint32_t GameEngine::GetInterpolationFPS() {
if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) {
return CVarGetInteger("gInterpolationFPS", 60);
}
if (CVarGetInteger("gMatchRefreshRate", 0)) {
return Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate();
} else if (CVarGetInteger("gVsyncEnabled", 1) ||
!Ship::Context::GetInstance()->GetWindow()->CanDisableVerticalSync()) {
return std::min<uint32_t>(Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(),
CVarGetInteger("gInterpolationFPS", 60));
}
return std::min<uint32_t>(Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(),
CVarGetInteger("gInterpolationFPS", 60));
return CVarGetInteger("gInterpolationFPS", 60);
}
uint32_t GameEngine::GetInterpolationFrameCount()