c# – Windows Phone 8加速度计事件
我正在为
Windows Phone(XNA)制作我的第一款游戏.我使用Accelerometer来改变屏幕上十字准线的位置:
这是我的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启动的应用程序和通常在同一设备上的应用程序之间存在差异? 解决方法
此解决方案有效,因为您保留对加速度计的引用.与所有.NET应用程序一样,Windows Phone应用程序使用自动化系统进行内存管理.后台进程称为垃圾收集器,定期检查对象,检测不再引用的对象,并清除它们.如果将Accelerometer声明为局部变量,则在函数退出时不再引用它,因此将被清除.当你宣布它是你班级的一员时,只要你的班级存在,它就会活着.
从Visual Studio启动代码时,会附加调试器.为了帮助您进行调试,它会对代码的执行方式产生一些影响.值得注意的是,它使垃圾收集器的方式更具攻击性.它解释了为什么在使用附加的调试器进行测试时没有遇到此问题.请注意,通过在Visual Studio中按Control F5可以获得相同的结果:它将在不附加调试器的情况下启动应用程序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |