gpt4 book ai didi

c# - Windows Phone 8 加速度计事件

转载 作者:太空狗 更新时间:2023-10-29 21:34:23 24 4
gpt4 key购买 nike

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

Position of crosshair

这是我的 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 上运行良好,但是当我在手机(未连接到计算机)中启动游戏时,accelerometer_CurrentValueChanged 事件似乎是仅在应用程序启动时调用一次。

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

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

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

最佳答案

Why this solution works?

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

Why the difference between application launched from VS and normally, on the same device?

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

关于c# - Windows Phone 8 加速度计事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17596575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com