簡體   English   中英

Windows Phone 8加速計事件

[英]Windows Phone 8 Accelerometer events

我正在為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啟動的應用程序和通常在同一設備上的應用程序之間存在差異?

為何此解決方案有效?

此解決方案有效,因為您保留對加速度計的引用。 與所有.NET應用程序一樣,Windows Phone應用程序使用自動化系統進行內存管理。 后台進程稱為垃圾收集器,定期檢查對象,檢測不再引用的對象,並清除它們。 如果將Accelerometer聲明為局部變量,則在函數退出時不再引用它,因此將被清除。 當你宣布它是你班級的一員時,只要你的班級存在,它就會活着。

為什么從VS啟動應用程序與通常在同一設備上的區別?

從Visual Studio啟動代碼時,會附加調試器。 為了幫助您進行調試,它會對代碼的執行方式產生一些影響。 值得注意的是,它使垃圾收集器的方式更具攻擊性。 它解釋了為什么在使用附加的調試器進行測試時沒有遇到此問題。 請注意,通過在Visual Studio中按Control + F5可以獲得相同的結果:它將在不附加調試器的情況下啟動應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM