vsync: separa preferència persistent de l'estat aplicat al hardware

This commit is contained in:
2026-05-17 13:09:28 +02:00
parent dbef9c558d
commit 1d46c4f3bd
+13 -8
View File
@@ -642,13 +642,12 @@ void Screen::toggleIntegerScale() {
}
}
// Alterna entre activar y desactivar el V-Sync
// Alterna entre activar y desactivar el V-Sync. ÚNICA via "user-facing" que
// modifica la preferencia persistent (Options::video.vsync); la resta de
// crides a setVSync apliquen l'estat al hardware sense escriure preferència.
void Screen::toggleVSync() {
Options::video.vsync = !Options::video.vsync;
SDL_SetRenderVSync(renderer_, Options::video.vsync ? 1 : SDL_RENDERER_VSYNC_DISABLED);
if (shader_backend_) {
shader_backend_->setVSync(Options::video.vsync);
}
setVSync(Options::video.vsync);
}
// Aplica Options::video.scale_mode a la textura del canvas de juego
@@ -670,10 +669,16 @@ auto Screen::isHardwareAccelerated() -> bool {
return self != nullptr && self->shader_backend_ && self->shader_backend_->isHardwareAccelerated();
}
// Establece el estado del V-Sync
// Aplica V-Sync al renderer SDL i al backend GPU. NO toca la preferència
// persistent (Options::video.vsync) — és responsabilitat del caller (menú
// servei, toggleVSync). Així Resource::beginLoad/finishBoot poden canviar
// el vsync efectiu durant el preload sense clobberar la preferència de
// l'usuari (bug històric: el seu vsync=true es perdia entre llançaments).
void Screen::setVSync(bool enabled) {
Options::video.vsync = enabled;
SDL_SetRenderVSync(renderer_, enabled ? 1 : SDL_RENDERER_VSYNC_DISABLED);
if (shader_backend_) {
shader_backend_->setVSync(enabled);
}
}
// Obtiene los punteros a los singletones
@@ -698,7 +703,7 @@ void Screen::getSingletons() {
// el viewport queda cacheado al tamaño de la ventana pequeña previa y el juego
// se ve pequeño y centrado con barras negras alrededor.
void Screen::applySettings() {
SDL_SetRenderVSync(renderer_, Options::video.vsync ? 1 : SDL_RENDERER_VSYNC_DISABLED);
setVSync(Options::video.vsync);
setFullscreenMode();
adjustWindowSize();
SDL_SetRenderLogicalPresentation(renderer_, param.game.width, param.game.height, Options::video.integer_scale ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE : SDL_LOGICAL_PRESENTATION_LETTERBOX);