【问题标题】:Windows Phone 8 Accelerometer eventsWindows Phone 8 加速度计事件
【发布时间】:2013-07-11 14:48:59
【问题描述】:

我正在为 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 启动的应用程序与正常启动的应用程序之间存在差异,即使在同一设备上也是如此?

【问题讨论】:

    标签: c# xna windows-phone-8


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我对这个答案非常满意。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多