From 85d711ccd2ff0aae2cce148609f1479a8ac75f91 Mon Sep 17 00:00:00 2001 From: "PSp..om" Date: Thu, 2 Jun 2011 07:23:54 +0000 Subject: [PATCH] Converted the raw input listener loop to use a cached array copy of the raw input listener list. This prevents the whole thing from blowing up if a RawInputListener is removed as the result of a raw input event. It's also ever so slightly faster. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7543 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../src/core/com/jme3/input/InputManager.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/engine/src/core/com/jme3/input/InputManager.java b/engine/src/core/com/jme3/input/InputManager.java index 850571a58..9670a39dc 100644 --- a/engine/src/core/com/jme3/input/InputManager.java +++ b/engine/src/core/com/jme3/input/InputManager.java @@ -86,6 +86,7 @@ public class InputManager implements RawInputListener { private final IntMap pressedButtons = new IntMap(); private final IntMap axisValues = new IntMap(); private ArrayList rawListeners = new ArrayList(); + private RawInputListener[] rawListenerArray = null; private ArrayList inputQueue = new ArrayList(); private static class Mapping { @@ -509,22 +510,30 @@ public class InputManager implements RawInputListener { public void addRawInputListener(RawInputListener listener) { rawListeners.add(listener); + rawListenerArray = null; } public void removeRawInputListener(RawInputListener listener) { rawListeners.remove(listener); + rawListenerArray = null; } public void clearRawInputListeners() { rawListeners.clear(); + rawListenerArray = null; + } + + private RawInputListener[] getRawListenerArray() { + if (rawListenerArray == null) + rawListenerArray = rawListeners.toArray(new RawInputListener[rawListeners.size()]); + return rawListenerArray; } private void processQueue() { int queueSize = inputQueue.size(); - int numRawListeners = rawListeners.size(); - - for (int i = 0; i < numRawListeners; i++) { - RawInputListener listener = rawListeners.get(i); + RawInputListener[] array = getRawListenerArray(); + + for (RawInputListener listener : array) { listener.beginInput(); for (int j = 0; j < queueSize; j++) {