From 44f50c647ed4a9fe376ec6423a198367702407fd Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 9 Jun 2020 21:47:41 -0700 Subject: [PATCH] Fixed bug 5171 - PollEvent impacts performance in 2.0.12 On some systems, GetClipCursor() impacts performance when called frequently, so only call it every once in a while to make sure we haven't lost our capture. --- src/video/windows/SDL_windowsevents.c | 13 +++++++++++-- src/video/windows/SDL_windowswindow.c | 3 ++- src/video/windows/SDL_windowswindow.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 52e4603c9..4ee1b07de 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -497,6 +497,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y); WIN_CheckAsyncMouseRelease(data); + WIN_UpdateClipCursor(data->window); /* * FIXME: Update keyboard state @@ -1117,11 +1118,19 @@ static void WIN_UpdateClipCursorForWindows() { SDL_VideoDevice *_this = SDL_GetVideoDevice(); SDL_Window *window; + Uint32 now = SDL_GetTicks(); + const Uint32 CLIPCURSOR_UPDATE_INTERVAL_MS = 3000; if (_this) { for (window = _this->windows; window; window = window->next) { - if (window->driverdata) { - WIN_UpdateClipCursor(window); + SDL_WindowData *data = (SDL_WindowData *)window->driverdata; + if (data) { + if (data->skip_update_clipcursor) { + data->skip_update_clipcursor = SDL_FALSE; + WIN_UpdateClipCursor(window); + } else if ((now - data->last_updated_clipcursor) >= CLIPCURSOR_UPDATE_INTERVAL_MS) { + WIN_UpdateClipCursor(window); + } } } } diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index ef73142ac..825680e44 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -34,6 +34,7 @@ #include "SDL_windowsvideo.h" #include "SDL_windowswindow.h" #include "SDL_hints.h" +#include "SDL_timer.h" /* Dropfile support */ #include @@ -926,7 +927,6 @@ WIN_UpdateClipCursor(SDL_Window *window) return; } if (data->skip_update_clipcursor) { - data->skip_update_clipcursor = SDL_FALSE; return; } if (!GetClipCursor(&clipped_rect)) { @@ -969,6 +969,7 @@ WIN_UpdateClipCursor(SDL_Window *window) ClipCursor(NULL); SDL_zero(data->cursor_clipped_rect); } + data->last_updated_clipcursor = SDL_GetTicks(); } int diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h index 574a45248..cfbf12050 100644 --- a/src/video/windows/SDL_windowswindow.h +++ b/src/video/windows/SDL_windowswindow.h @@ -46,6 +46,7 @@ typedef struct SDL_bool in_title_click; Uint8 focus_click_pending; SDL_bool skip_update_clipcursor; + Uint32 last_updated_clipcursor; SDL_bool windowed_mode_was_maximized; SDL_bool in_window_deactivation; RECT cursor_clipped_rect;