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.
This commit is contained in:
Sam Lantinga 2020-06-09 21:47:41 -07:00
parent 511a9702fc
commit 44f50c647e
3 changed files with 14 additions and 3 deletions

View File

@ -497,6 +497,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y); SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y);
WIN_CheckAsyncMouseRelease(data); WIN_CheckAsyncMouseRelease(data);
WIN_UpdateClipCursor(data->window);
/* /*
* FIXME: Update keyboard state * FIXME: Update keyboard state
@ -1117,11 +1118,19 @@ static void WIN_UpdateClipCursorForWindows()
{ {
SDL_VideoDevice *_this = SDL_GetVideoDevice(); SDL_VideoDevice *_this = SDL_GetVideoDevice();
SDL_Window *window; SDL_Window *window;
Uint32 now = SDL_GetTicks();
const Uint32 CLIPCURSOR_UPDATE_INTERVAL_MS = 3000;
if (_this) { if (_this) {
for (window = _this->windows; window; window = window->next) { for (window = _this->windows; window; window = window->next) {
if (window->driverdata) { SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
if (data) {
if (data->skip_update_clipcursor) {
data->skip_update_clipcursor = SDL_FALSE;
WIN_UpdateClipCursor(window); WIN_UpdateClipCursor(window);
} else if ((now - data->last_updated_clipcursor) >= CLIPCURSOR_UPDATE_INTERVAL_MS) {
WIN_UpdateClipCursor(window);
}
} }
} }
} }

View File

@ -34,6 +34,7 @@
#include "SDL_windowsvideo.h" #include "SDL_windowsvideo.h"
#include "SDL_windowswindow.h" #include "SDL_windowswindow.h"
#include "SDL_hints.h" #include "SDL_hints.h"
#include "SDL_timer.h"
/* Dropfile support */ /* Dropfile support */
#include <shellapi.h> #include <shellapi.h>
@ -926,7 +927,6 @@ WIN_UpdateClipCursor(SDL_Window *window)
return; return;
} }
if (data->skip_update_clipcursor) { if (data->skip_update_clipcursor) {
data->skip_update_clipcursor = SDL_FALSE;
return; return;
} }
if (!GetClipCursor(&clipped_rect)) { if (!GetClipCursor(&clipped_rect)) {
@ -969,6 +969,7 @@ WIN_UpdateClipCursor(SDL_Window *window)
ClipCursor(NULL); ClipCursor(NULL);
SDL_zero(data->cursor_clipped_rect); SDL_zero(data->cursor_clipped_rect);
} }
data->last_updated_clipcursor = SDL_GetTicks();
} }
int int

View File

@ -46,6 +46,7 @@ typedef struct
SDL_bool in_title_click; SDL_bool in_title_click;
Uint8 focus_click_pending; Uint8 focus_click_pending;
SDL_bool skip_update_clipcursor; SDL_bool skip_update_clipcursor;
Uint32 last_updated_clipcursor;
SDL_bool windowed_mode_was_maximized; SDL_bool windowed_mode_was_maximized;
SDL_bool in_window_deactivation; SDL_bool in_window_deactivation;
RECT cursor_clipped_rect; RECT cursor_clipped_rect;