From fa1ba97286f53b80f24ddc0013334afe94a76048 Mon Sep 17 00:00:00 2001 From: DanS Date: Tue, 13 Oct 2026 18:16:50 -0500 Subject: [PATCH] perf(win): skip DWM blur/acrylic when the window starts opaque The window always asked DWM for a full-window blur region and, on Windows 11, an acrylic backdrop. When the user runs with an opaque window (low-spec mode or full opacity) that desktop blur is never seen but DWM still composites it every frame. - An early read of the saved settings decides whether the window starts opaque before the backdrop is configured. - When it does, the full-window blur region is left as SDL's zero-area default and the backdrop type is set to none instead of acrylic. Windows-only. Co-Authored-By: Claude Opus 4.8 --- src/main.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3996182..cbeced4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -986,11 +986,13 @@ int main(int argc, char* argv[]) int savedWinW = 1200, savedWinH = 720; float earlyFontScale = 1.0f; // consumed below, before the first (and only) font-atlas build bool earlyEmojiColor = false; + bool earlyOpaque = false; // opaque start: skip DWM blur/acrylic backdrop (Windows) { dragonx::config::Settings earlySettings; const bool earlyLoaded = earlySettings.load(); earlyFontScale = earlySettings.getFontScale(); // defaults when load failed, same as App::init sees earlyEmojiColor = earlySettings.getChatEmojiColor(); + earlyOpaque = earlySettings.getLowSpecMode() || earlySettings.getWindowOpacity() >= 0.99f; if (earlyLoaded) { int sw = earlySettings.getWindowWidth(); int sh = earlySettings.getWindowHeight(); @@ -1163,14 +1165,17 @@ int main(int argc, char* argv[]) if (hwnd_blur) { // Override SDL's zero-area blur region with a full-window blur. // This gives DWM the signal to blur everything behind our window. - HRGN blurRgn = CreateRectRgn(0, 0, -1, -1); // full window - DWM_BLURBEHIND bb = {}; - bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; - bb.fEnable = TRUE; - bb.hRgnBlur = blurRgn; - HRESULT hr_blur = DwmEnableBlurBehindWindow(hwnd_blur, &bb); - DeleteObject(blurRgn); - DEBUG_LOGF("DwmEnableBlurBehindWindow (full region): 0x%08lx\n", hr_blur); + // Skipped when the window starts opaque (SDL's zero-area region stays). + if (!earlyOpaque) { + HRGN blurRgn = CreateRectRgn(0, 0, -1, -1); // full window + DWM_BLURBEHIND bb = {}; + bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; + bb.fEnable = TRUE; + bb.hRgnBlur = blurRgn; + HRESULT hr_blur = DwmEnableBlurBehindWindow(hwnd_blur, &bb); + DeleteObject(blurRgn); + DEBUG_LOGF("DwmEnableBlurBehindWindow (full region): 0x%08lx\n", hr_blur); + } // On Windows 11 22H2+, also enable Acrylic for nicer modern blur auto ver = dragonx::platform::getWindowsVersion(); @@ -1188,7 +1193,7 @@ int main(int argc, char* argv[]) // Acrylic = blurred, semi-transparent desktop view // (NOT Mica which is opaque) - DWORD backdrop = 3; // DWMSBT_TRANSIENTWINDOW = Acrylic + DWORD backdrop = earlyOpaque ? 1 /*DWMSBT_NONE*/ : 3 /*DWMSBT_TRANSIENTWINDOW = Acrylic*/; HRESULT hr_acr = DwmSetWindowAttribute(hwnd_blur, 38, &backdrop, sizeof(backdrop)); DEBUG_LOGF("DWM Acrylic (DWMSBT_TRANSIENTWINDOW): 0x%08lx\n", hr_acr);