diff --git a/source/core/rendering/screen.cpp b/source/core/rendering/screen.cpp index 951bdf2..b50791d 100644 --- a/source/core/rendering/screen.cpp +++ b/source/core/rendering/screen.cpp @@ -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);