安卓:读加速度计无内存分配?加速度计、分配、内存

2023-09-05 04:14:35 作者:拿命珍惜她

我正在开发一个游戏为Android(2.1+),使用加速计作为用户输入。我用一个传感器监听器,我在登记与传感器管理活动的开始,如下所示:

I am developing a game for Android (2.1+), using the accelerometer as user input. I use a sensor listener that I register at the beginning of the activity with the sensor manager, as follows:

mSensorManager.registerListener(SystemRegistry.inputSystem.mSensorListener,
                                accSensor, SensorManager.SENSOR_DELAY_UI);  

这工作得很好,我刚读 onSensorChanged(SensorEvent事件)的加速计值为了使用它在我的游戏循环:

That works well and I just read the accelerometer values in onSensorChanged(SensorEvent event) in order to use it in my game loop:

public void onSensorChanged(SensorEvent event){
     accX = event.values[0];
     accY = event.values[1];
     accY = event.values[2];
 }

我写一个实时游戏,所以我试图避免在我的code任何内存分配,因为我希望尽量减少垃圾收集。问题是,每次有一个 SensorEvent 时,传感器管理实际分配内存。下面是例如DDMS分配跟踪器的输出:

I am writing a real-time game so I am trying to avoid any memory allocation in my code, since I want to minimize the garbage collection. The problem is that every time there is a SensorEvent, the sensor manager actually allocates memory. Here is for example the output of the ddms allocation tracker:

51  28  android.hardware.SensorEvent    9   android.hardware.SensorManager$ListenerDelegate createSensorEvent   
50  28  float[] 9   android.hardware.SensorEvent    <init>  

其示出28 * 2 = 56分配在每一个事件字节。这似乎已经引发了垃圾收集经常的效应,这导致一些滞后......因此,这里是我的问题:有没有办法来达到同样的事情(获取当前的加速度矢量),不分配任何内存?有没有办法真正按需读取这个载体的价值,而无需等待一个事件?

which shows 28*2=56 bytes allocated at every event. This seems to have the effect of triggering the garbage collector quite often, which induces some lags... So here is my question: is there a way to achieve the same thing (getting the current acceleration vector), without allocating any memory? Is there a way to actually read on demand the values of this vector without waiting for an event?

推荐答案

听起来我们需要在我们这边解决,我会在内部文件中的错误。东西

Sounds like something we need to fix on our side, I'll file a bug internally.