2013-07-11 26 views
6

Tworzę swoją pierwszą grę dla Windows Phone (XNA). Używam akcelerometr, aby zmienić położenie celownika na ekranie:Zdarzenia z akcelerometru Windows Phone 8

Position of crosshair

Oto kod w moim initialize() funkcji (zauważ, że Akcelerometr jest lokalna zmienna zadeklarowana tylko w tej funkcji):

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

I obsługi zdarzeń:

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); 
      } 
     } 

To działa prawidłowo na emulatorze Windows Phone i na mojej Nokia Lumia 520 podłączonej do komputera i uruchamianej z Visual Studio, jednak gdy uruchomię grę w telefonie (nie jest połączona z komputerem), zdarzenie accelerometer_CurrentValueChanged wydaje się być wywoływane tylko raz, w aplikacji uruchomienie.

Moje rozwiązanie było uczynienie akcelerometru członkiem mojej klasy gier, a następnie kod w Initialize() tak:

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

Więc moje pytanie brzmi, dlaczego to działa rozwiązanie? I dlaczego jest różnica między aplikacją uruchamianą z VS a normalnie, nawet na tym samym urządzeniu?

Odpowiedz

6

Dlaczego to rozwiązanie działa?

To rozwiązanie działa, ponieważ zachowujesz referencję do akcelerometru. Aplikacje Windows Phone, podobnie jak wszystkie aplikacje .NET, używają automatycznego systemu zarządzania pamięcią. Proces działający w tle, zwany garbage collector, regularnie sprawdza obiekty, wykrywa te, które nie są już przywoływane i czyści je. Jeśli deklarujesz akcelerometr jako zmienną lokalną, nie będzie on już odwoływał się, gdy funkcja zostanie zakończona, i dlatego zostanie oczyszczona. Kiedy ogłosisz go jako członka twojej klasy, będzie żył tak długo, jak długo twoja klasa będzie żyła.

Dlaczego różnica między aplikacją uruchamianą z VS a normalnie, na tym samym urządzeniu?

Podczas uruchamiania kodu z Visual Studio dołączony jest debugger. Aby pomóc Ci w debugowaniu, ma to pewien wpływ na sposób wykonywania kodu. Zwłaszcza, że ​​sposób śmieciarza jest mniej agresywny. Wyjaśnia, dlaczego ten problem nie występował podczas testowania z dołączonym debuggerem. Zauważ, że możesz osiągnąć ten sam wynik, naciskając Control + F5 w Visual Studio: uruchomi aplikację bez dołączania debuggera.

+0

Jestem w pełni zadowolony z tej odpowiedzi. Dzięki – Przemen