Browse Source

Windows: reduce stuttering in windowed mode via DwmFlush

Resolves issue #1628
Alex Szpakowski 4 years ago
parent
commit
5dd4a463be
2 changed files with 19 additions and 0 deletions
  1. 1 0
      CMakeLists.txt
  2. 18 0
      src/modules/window/sdl/Window.cpp

+ 1 - 0
CMakeLists.txt

@@ -1741,6 +1741,7 @@ if(MSVC)
 	set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES}
 		ws2_32.lib
 		winmm.lib
+		dwmapi.lib
 	)
 
 	set(LOVE_RC

+ 18 - 0
src/modules/window/sdl/Window.cpp

@@ -44,6 +44,8 @@
 
 #if defined(LOVE_WINDOWS)
 #include <windows.h>
+#include <dwmapi.h>
+#include <VersionHelpers.h>
 #elif defined(LOVE_MACOSX)
 #include "common/macosx.h"
 #endif
@@ -1010,6 +1012,22 @@ bool Window::isMinimized() const
 void Window::swapBuffers()
 {
 	SDL_GL_SwapWindow(window);
+
+#ifdef LOVE_WINDOWS
+	// https://github.com/love2d/love/issues/1628
+	// DwmFlush helps avoid apparent stuttering in windowed mode on Windows. Be careful to only call it when
+	// the compositor may be active and non-adaptive vsync is enabled (it syncs to nearest refresh which stops the
+	// "adaptive" part of adaptive vsync).
+	// Calling it directly after vsync seems to have less chance of dropping a frame than directly before.
+	if (context != nullptr && (!settings.fullscreen || settings.fstype == FULLSCREEN_DESKTOP) && getVSync() > 0)
+	{
+		// Desktop composition is always enabled in Windows 8+. But DwmIsCompositionEnabled won't always return true...
+		// (see DwmIsCompositionEnabled docs).
+		BOOL compositionEnabled = IsWindows8OrGreater();
+		if (compositionEnabled || (SUCCEEDED(DwmIsCompositionEnabled(&compositionEnabled)) && compositionEnabled))
+			DwmFlush();
+	}
+#endif
 }
 
 bool Window::hasFocus() const