[英]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.