Android:没有内存分配的读取加速度计?

时间:2011-02-12 16:49:52

标签: android performance memory accelerometer

我正在开发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 个答案:

答案 0 :(得分:3)

听起来像我们需要修复的东西,我会在内部提交错误。

答案 1 :(得分:0)

我相信只有在SensorEventListener中注册了多个Sensor时才会出现此问题。我认为解决方法是为每个Sensor使用不同的SensorEventListener。

另外,请确保不要使用两个不同的SensorEventListener注册SAME传感器 - 在这种情况下,有一个错误已在Gingerbread中修复。

另一个不太吸引人的选择是使用Gingerbread NDK,它没有这个问题。

我希望这会有所帮助。