Я разрабатываю игру для 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 байтов, выделенных для каждого события.Похоже, что это приводит к частому запуску сборщика мусора, что вызывает некоторые лаги ... Итак, вот мой вопрос: есть ли способ достичь того же (получить текущий вектор ускорения) без выделения какой-либо памяти?Есть ли способ фактически прочитать значения этого вектора по требованию, не ожидая события?