Batch controller axis events for reduced CPU usage on Steam Link

This commit is contained in:
Cameron Gutman
2019-04-28 15:16:04 -07:00
parent cec527ffd5
commit 4f00f62674
+20 -1
View File
@@ -652,11 +652,15 @@ Uint32 SdlInputHandler::mouseMoveTimerCallback(Uint32 interval, void *param)
void SdlInputHandler::handleControllerAxisEvent(SDL_ControllerAxisEvent* event) void SdlInputHandler::handleControllerAxisEvent(SDL_ControllerAxisEvent* event)
{ {
GamepadState* state = findStateForGamepad(event->which); SDL_JoystickID gameControllerId = event->which;
GamepadState* state = findStateForGamepad(gameControllerId);
if (state == NULL) { if (state == NULL) {
return; return;
} }
// Batch all pending axis motion events for this gamepad to save CPU time
SDL_Event nextEvent;
for (;;) {
switch (event->axis) switch (event->axis)
{ {
case SDL_CONTROLLER_AXIS_LEFTX: case SDL_CONTROLLER_AXIS_LEFTX:
@@ -689,6 +693,21 @@ void SdlInputHandler::handleControllerAxisEvent(SDL_ControllerAxisEvent* event)
return; return;
} }
// Check for another event to batch with
if (SDL_PeepEvents(&nextEvent, 1, SDL_PEEKEVENT, SDL_CONTROLLERAXISMOTION, SDL_CONTROLLERAXISMOTION) <= 0) {
break;
}
event = &nextEvent.caxis;
if (event->which != gameControllerId) {
// Stop batching if a different gamepad interrupts us
break;
}
// Remove the next event to batch
SDL_PeepEvents(&nextEvent, 1, SDL_GETEVENT, SDL_CONTROLLERAXISMOTION, SDL_CONTROLLERAXISMOTION);
}
sendGamepadState(state); sendGamepadState(state);
} }