Я разрабатываю игру для Android (2.1+), используя акселерометр в качестве пользовательского ввода. Я использую прослушиватель датчиков, который регистрирую в начале активности с помощью диспетчера датчиков, а именно:
mSensorManager.registerListener(SystemRegistry.inputSystem.mSensorListener,
accSensor, SensorManager.SENSOR_DELAY_UI);
Это работает хорошо, и я просто прочитал значения акселерометра в onSensorChanged (событие SensorEvent)
, чтобы использовать его в моем игровом цикле:
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 байтов, выделенных для каждого события. Похоже, это приводит к частому запуску сборщика мусора, что вызывает некоторые задержки ... Итак, вот мой вопрос: есть ли способ добиться того же (получить текущий вектор ускорения) без выделения памяти? Есть ли способ по запросу считывать значения этого вектора, не дожидаясь события?