Android: чтение акселерометра без выделения памяти? - PullRequest
6 голосов
/ 12 февраля 2011

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

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

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

0 голосов
/ 13 февраля 2011

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

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

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

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

...