这是我的Initialize()函数中的代码(请注意,Accelerometer是仅在此函数中声明的局部变量):
Accelerometer accelerometer = new Accelerometer(); accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged; accelerometer.Start();
和事件处理程序:
void accelerometer_CurrentValueChanged(object sender,SensorReadingEventArgs<AccelerometerReading> e) { lock (accelerometerVectorLock) { accelerometerVector = new Vector3( (float)e.SensorReading.Acceleration.X,(float)e.SensorReading.Acceleration.Y,(float)e.SensorReading.Acceleration.Z); } }
这适用于Windows Phone模拟器,以及连接到计算机并从Visual Studio启动的我的诺基亚Lumia 520,但是当我在手机中启动游戏(未连接到计算机)时,加速计_CurrentValueChanged事件似乎只被调用一次,在应用程序启动时.
我的解决方案是让加速度计成为我的Game类的成员,然后在Initialize()中编码,如下所示:
accelerometer = new Accelerometer(); accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged; accelerometer.Start();
所以我的问题是,为什么这个解决方案有效?为什么从VS启动的应用程序和通常在同一设备上的应用程序之间存在差异?
解决方法
Why this solution works?
此解决方案有效,因为您保留对加速度计的引用.与所有.NET应用程序一样,Windows Phone应用程序使用自动化系统进行内存管理.后台进程称为垃圾收集器,定期检查对象,检测不再引用的对象,并清除它们.如果将Accelerometer声明为局部变量,则在函数退出时不再引用它,因此将被清除.当你宣布它是你班级的一员时,只要你的班级存在,它就会活着.
Why the difference between application launched from VS and normally,on the same device?
从Visual Studio启动代码时,会附加调试器.为了帮助您进行调试,它会对代码的执行方式产生一些影响.值得注意的是,它使垃圾收集器的方式更具攻击性.它解释了为什么在使用附加的调试器进行测试时没有遇到此问题.请注意,通过在Visual Studio中按Control F5可以获得相同的结果:它将在不附加调试器的情况下启动应用程序.