微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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启动的应用程序和通常在同一设备上的应用程序之间存在差异?

解决方法

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 举报,一经查实,本站将立刻删除。

相关推荐