我正在开发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个字节。这似乎有经常触发垃圾收集器的效果,这会导致一些滞后......所以这是我的问题:有没有办法实现相同的事情(获取当前的加速度向量),而不分配任何内存?有没有办法在不等待事件的情况下实际读取此向量的值?
答案 0 :(得分:3)
听起来像我们需要修复的东西,我会在内部提交错误。
答案 1 :(得分:0)
我相信只有在SensorEventListener中注册了多个Sensor时才会出现此问题。我认为解决方法是为每个Sensor使用不同的SensorEventListener。
另外,请确保不要使用两个不同的SensorEventListener注册SAME传感器 - 在这种情况下,有一个错误已在Gingerbread中修复。
另一个不太吸引人的选择是使用Gingerbread NDK,它没有这个问题。
我希望这会有所帮助。