diff --git a/implementations/Crafter.Graphics-Window.cpp b/implementations/Crafter.Graphics-Window.cpp index 19f1f55..3891db7 100644 --- a/implementations/Crafter.Graphics-Window.cpp +++ b/implementations/Crafter.Graphics-Window.cpp @@ -698,7 +698,20 @@ void Window::StartSync() { } #endif #ifdef CRAFTER_GRAPHICS_WINDOW_WIN32 + // While updating, the FIFO present inside Update() paces this loop to the + // vblank, so the PeekMessage poll is vsync-gated. While NOT updating + // (paused / minimized / stopped) nothing throttles the loop, and a bare + // PeekMessage(PM_REMOVE) spin pins a core at 100% while uselessly re-running + // Gamepad::Tick() (mutex + per-pad COM reads) and onBeforeUpdate every + // iteration. Block on the message queue instead, waking on input or after a + // short timeout so gamepad polling / onBeforeUpdate still tick at a sane + // rate (e.g. to detect a controller button asking to resume). + constexpr DWORD kPausedPollIntervalMs = 16; while(open) { + if (!updating) { + MsgWaitForMultipleObjectsEx(0, nullptr, kPausedPollIntervalMs, + QS_ALLINPUT, MWMO_INPUTAVAILABLE); + } MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg);