2013-07-11 71 views
6

我正在爲Windows Phone(XNA)開發我的第一款遊戲。我使用加速度計來改變十字的屏幕上的位置:Windows Phone 8加速度計事件

Position of crosshair

這裏是我的初始化()函數的代碼(注意,加速度計只是在這個函數聲明的局部變量):

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事件似乎只在應用程序上調用一次啓動。

我的解決辦法是讓這樣的加速度計自己的遊戲類的成員,那麼在初始化(代碼):

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

所以我的問題是,爲什麼這個解決方案的工作?爲什麼從VS啓動的應用程序和正常啓動的應用程序之間存在差異,即使是在同一個設備上?

回答

6

爲什麼此解決方案有效?

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

爲什麼從VS啓動的應用程序與正常情況下在同一設備上的區別?

從Visual Studio啓動代碼時,會附加一個調試器。爲了幫助您調試,它對代碼的執行方式有一些影響。值得注意的是,它使垃圾收集器的方式較不積極。它解釋了爲什麼在使用附加調試器進行測試時沒有此問題。請注意,通過在Visual Studio中按控制 + F5可以實現相同的結果:它將在不連接調試器的情況下啓動應用程序。

+0

我完全滿意這個答案。謝謝 – Przemen