6

我正在为 Windows Phone (XNA) 制作我的第一款游戏。我使用加速度计来改变屏幕上十字准线的位置:

十字准线的位置

这是我的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 Emulator 和连接到计算机并从 Visual Studio 启动的诺基亚 Lumia 520 上运行良好,但是当我在手机中启动游戏(未连接到计算机)时,accelerometer_CurrentValueChanged 事件似乎只被调用一次, 在应用程序启动时。

我的解决方案是让加速度计成为我的 Game 类的成员,然后在 Initialize() 中编写如下代码:

accelerometer = new Accelerometer();
accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged;
accelerometer.Start();

所以我的问题是,为什么这个解决方案有效?为什么从 VS 启动的应用程序与正常启动的应用程序之间存在差异,即使在同一设备上也是如此?

4

1 回答 1

6

为什么这个解决方案有效?

此解决方案有效,因为您保留了对加速度计的引用。Windows Phone 应用程序与所有 .NET 应用程序一样,使用自动化系统进行内存管理。一个称为垃圾收集器的后台进程定期检查对象,检测那些不再被引用的对象,并清理它们。如果将加速度计声明为局部变量,则函数退出时将不再引用它,因此将被清除。当你将它声明为你的类的成员时,只要你的类存在,它就会一直存在。

为什么从 VS 启动的应用程序与通常在同一设备上启动的应用程序之间存在差异?

从 Visual Studio 启动代码时,会附加一个调试器。为了帮助您调试,它对代码的执行方式有一些影响。值得注意的是,它使垃圾收集器变得不那么激进。它解释了为什么您在使用附加的调试器进行测试时没有遇到此问题。请注意,您可以通过在 Visual Studio 中按Control+来获得相同的结果F5:它将启动应用程序而无需附加调试器。

于 2013-07-11T15:01:13.477 回答