Android: чтение акселерометра без выделения памяти?

Я разрабатываю игру для Android (2.1+), используя акселерометр в качестве пользовательского ввода. Я использую прослушиватель датчиков, который я регистрирую в начале действия с помощью диспетчера датчиков, следующим образом:

mSensorManager.registerListener(SystemRegistry.inputSystem.mSensorListener, accSensor, SensorManager.SENSOR_DELAY_UI); 

Это хорошо работает, и я просто прочитал значения акселерометра в onSensorChanged(SensorEvent event) , чтобы использовать его в своем игровом цикле:

 public void onSensorChanged(SensorEvent event){ accX = event.values[0]; accY = event.values[1]; accY = event.values[2]; } 

Я пишу игру в реальном времени, поэтому я стараюсь избежать выделения памяти в своем коде, так как я хочу свести к минимуму сбор мусора. Проблема в том, что каждый раз, когда имеется SensorEvent , диспетчер датчиков фактически выделяет память. Вот, например, вывод трекера распределения ddms:

 51 28 android.hardware.SensorEvent 9 android.hardware.SensorManager$ListenerDelegate createSensorEvent 50 28 float[] 9 android.hardware.SensorEvent <init> 

Который показывает 28 * 2 = 56 байт, выделенных на каждом событии. Похоже, что это приводит к тому, что сборщик мусора часто возникает, что вызывает некоторые задержки … Итак, вот мой вопрос: есть ли способ достичь того же (получение текущего вектора ускорения), не выделяя никакой памяти? Есть ли способ действительно прочитать по требованию значения этого вектора, не дожидаясь события?

Solutions Collecting From Web of "Android: чтение акселерометра без выделения памяти?"

Похоже на то, что нам нужно исправить на нашей стороне, я буду делать ошибку внутри.

Я считаю, что эта проблема возникает только при наличии более одного датчика, зарегистрированного в SensorEventListener. Я думаю, что обходным решением будет использование другого SensorEventListener для каждого датчика.

Также не забудьте НЕ зарегистрировать SAME Sensor с двумя разными SensorEventListener – в этом случае была ошибка, которая была исправлена ​​в Gingerbread.

Другим, менее привлекательным вариантом будет использование Gingerbread NDK, который не имеет этой проблемы.

Надеюсь, это поможет.