From 6c8eed04ca556c90763ec9a543d0c06963a7c480 Mon Sep 17 00:00:00 2001 From: Anton Klinger Date: Sat, 24 Jun 2023 14:41:46 +0200 Subject: [PATCH 1/3] reduce the garbage produced every update cache ControllerButton.values() and ControllerAxis.values() to prevent creating garbage also axis values are no longer boxed into Float objects every update --- .../controllers/desktop/support/FloatWrapper.java | 5 +++++ .../desktop/support/JamepadController.java | 15 +++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java diff --git a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java new file mode 100644 index 0000000..28d84bf --- /dev/null +++ b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java @@ -0,0 +1,5 @@ +package com.badlogic.gdx.controllers.desktop.support; + +public class FloatWrapper { + public float value; +} diff --git a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java index 9fdb2fe..f6315e9 100644 --- a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java +++ b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java @@ -18,6 +18,8 @@ public class JamepadController implements Controller { private static final IntMap CODE_TO_BUTTON = new IntMap<>(ControllerButton.values().length); private static final IntMap CODE_TO_AXIS = new IntMap<>(ControllerAxis.values().length); private static final Logger logger = new Logger(JamepadController.class.getSimpleName()); + private static final ControllerButton[] CONTROLLER_BUTTON_VALUES = ControllerButton.values(); + private static final ControllerAxis[] CONTROLLER_AXIS_VALUES = ControllerAxis.values(); static { for (ControllerButton button : ControllerButton.values()) { @@ -31,7 +33,7 @@ public class JamepadController implements Controller { private final CompositeControllerListener compositeControllerListener = new CompositeControllerListener(); private final IntMap buttonState = new IntMap<>(); - private final IntMap axisState = new IntMap<>(); + private final IntMap axisState = new IntMap<>(); private final String uuid; private final String name; private ControllerIndex controllerIndex; @@ -128,22 +130,23 @@ private ControllerAxis toAxis(int axisCode) { } private void updateAxisState() { - for (ControllerAxis axis : ControllerAxis.values()) { + for (ControllerAxis axis : CONTROLLER_AXIS_VALUES) { int id = axis.ordinal(); float value = getAxis(id); - if (value != axisState.get(id)) { + FloatWrapper axisValueWrapper = axisState.get(id); + if (value != axisValueWrapper.value) { if (logger.getLevel() == Logger.DEBUG) { logger.debug("Axis [" + id + " - " + toAxis(id) + "] moved [" + value + "]"); } compositeControllerListener.axisMoved(this, id, value); } - axisState.put(id, value); + axisValueWrapper.value = value; } } private void updateButtonsState() { - for (ControllerButton button : ControllerButton.values()) { + for (ControllerButton button : CONTROLLER_BUTTON_VALUES) { int id = button.ordinal(); boolean pressed = getButton(id); @@ -164,7 +167,7 @@ private void updateButtonsState() { private void initializeState() { for (ControllerAxis axis : ControllerAxis.values()) { - axisState.put(axis.ordinal(), 0.0f); + axisState.put(axis.ordinal(), new FloatWrapper()); } for (ControllerButton button : ControllerButton.values()) { From 114d6a51edf4846745dffb686e748067429f4b97 Mon Sep 17 00:00:00 2001 From: Anton Klinger Date: Sat, 24 Jun 2023 18:00:02 +0200 Subject: [PATCH 2/3] use IntFloatMap provided by libgdx instead of running a custom solution --- .../gdx/controllers/desktop/support/FloatWrapper.java | 5 ----- .../controllers/desktop/support/JamepadController.java | 10 +++++----- 2 files changed, 5 insertions(+), 10 deletions(-) delete mode 100644 gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java diff --git a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java deleted file mode 100644 index 28d84bf..0000000 --- a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/FloatWrapper.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.badlogic.gdx.controllers.desktop.support; - -public class FloatWrapper { - public float value; -} diff --git a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java index f6315e9..e8401db 100644 --- a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java +++ b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.controllers.ControllerListener; import com.badlogic.gdx.controllers.ControllerMapping; import com.badlogic.gdx.controllers.ControllerPowerLevel; +import com.badlogic.gdx.utils.IntFloatMap; import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.Logger; import com.badlogic.gdx.utils.TimeUtils; @@ -33,7 +34,7 @@ public class JamepadController implements Controller { private final CompositeControllerListener compositeControllerListener = new CompositeControllerListener(); private final IntMap buttonState = new IntMap<>(); - private final IntMap axisState = new IntMap<>(); + private final IntFloatMap axisState = new IntFloatMap(); private final String uuid; private final String name; private ControllerIndex controllerIndex; @@ -134,14 +135,13 @@ private void updateAxisState() { int id = axis.ordinal(); float value = getAxis(id); - FloatWrapper axisValueWrapper = axisState.get(id); - if (value != axisValueWrapper.value) { + if (value != axisState.get(id, 0)) { if (logger.getLevel() == Logger.DEBUG) { logger.debug("Axis [" + id + " - " + toAxis(id) + "] moved [" + value + "]"); } compositeControllerListener.axisMoved(this, id, value); } - axisValueWrapper.value = value; + axisState.put(id, value); } } @@ -167,7 +167,7 @@ private void updateButtonsState() { private void initializeState() { for (ControllerAxis axis : ControllerAxis.values()) { - axisState.put(axis.ordinal(), new FloatWrapper()); + axisState.put(axis.ordinal(), 0); } for (ControllerButton button : ControllerButton.values()) { From 807223566fe20b8c9a00177a5a3d194f4f70028e Mon Sep 17 00:00:00 2001 From: Anton Klinger Date: Wed, 13 Dec 2023 11:01:21 +0100 Subject: [PATCH 3/3] add comment to explain why these constants were introduced also use the constants instead of ControllerButton.values() consistently throughout the file --- .../controllers/desktop/support/JamepadController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java index e8401db..d354467 100644 --- a/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java +++ b/gdx-controllers-desktop/src/main/java/com/badlogic/gdx/controllers/desktop/support/JamepadController.java @@ -19,15 +19,16 @@ public class JamepadController implements Controller { private static final IntMap CODE_TO_BUTTON = new IntMap<>(ControllerButton.values().length); private static final IntMap CODE_TO_AXIS = new IntMap<>(ControllerAxis.values().length); private static final Logger logger = new Logger(JamepadController.class.getSimpleName()); + // ControllerButton.values() and ControllerAxis.values() is cached once, to avoid producing garbage every frame private static final ControllerButton[] CONTROLLER_BUTTON_VALUES = ControllerButton.values(); private static final ControllerAxis[] CONTROLLER_AXIS_VALUES = ControllerAxis.values(); static { - for (ControllerButton button : ControllerButton.values()) { + for (ControllerButton button : CONTROLLER_BUTTON_VALUES) { CODE_TO_BUTTON.put(button.ordinal(), button); } - for (ControllerAxis axis : ControllerAxis.values()) { + for (ControllerAxis axis : CONTROLLER_AXIS_VALUES) { CODE_TO_AXIS.put(axis.ordinal(), axis); } } @@ -166,11 +167,11 @@ private void updateButtonsState() { } private void initializeState() { - for (ControllerAxis axis : ControllerAxis.values()) { + for (ControllerAxis axis : CONTROLLER_AXIS_VALUES) { axisState.put(axis.ordinal(), 0); } - for (ControllerButton button : ControllerButton.values()) { + for (ControllerButton button : CONTROLLER_BUTTON_VALUES) { buttonState.put(button.ordinal(), false); } }