这是我的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可以获得相同的结果:它将在不附加调试器的情况下启动应用程序.
原文地址:https://www.jb51.cc/csharp/244592.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。