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);
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);
}
}
}
}

View file

@ -34,6 +34,7 @@
#include "SDL_windowsvideo.h"
#include "SDL_windowswindow.h"
#include "SDL_hints.h"
#include "SDL_timer.h"
/* Dropfile support */
#include <shellapi.h>
@ -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

View file

@ -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;