2013-07-11 15 views
6

Sto realizzando il mio primo gioco per Windows Phone (XNA). Io uso accelerometro per cambiare la posizione di un mirino sullo schermo:Windows Phone 8 Accelerometro eventi

Position of crosshair

Ecco il codice nel mio Initialize() funzione (si noti che accelerometro è variabile locale dichiarata solo in questa funzione):

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

E il gestore di eventi:

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

Questo funziona bene su Windows Phone Emulator e sul mio Nokia Lumia 520 collegato al computer e avvio da Visual Studio, tuttavia quando lancio il gioco nel telefono (non connesso al computer), l'evento accelerometer_CurrentValueChanged sembra essere chiamato una sola volta, su richiesta avviare.

La mia soluzione era di fare l'accelerometro un membro della mia classe di gioco, poi il codice a Initialize() in questo modo:

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

Quindi la mia domanda è, perché fa questo lavoro soluzione? E perché c'è una differenza tra l'applicazione lanciata da VS e normalmente, anche sullo stesso dispositivo?

risposta

6

Perché questa soluzione funziona?

Questa soluzione funziona perché si sta mantenendo un riferimento all'accelerometro. Le applicazioni Windows Phone, come tutte le applicazioni .NET, utilizzano un sistema automatico per la gestione della memoria. Un processo in background, chiamato garbage collector, ispeziona regolarmente gli oggetti, rileva quelli che non sono più referenziati e li pulisce. Se si dichiara l'accelerometro come variabile locale, non verrà più fatto riferimento quando la funzione termina e quindi verrà pulita. Quando lo dichiari come un membro della tua classe, sarà vivo per tutto il tempo in cui la tua classe vive.

Perché la differenza tra l'applicazione avviata da VS e normalmente, sullo stesso dispositivo?

All'avvio del codice da Visual Studio, è collegato un debugger. Per facilitare il debug, ha qualche impatto sul modo in cui il codice viene eseguito. In particolare, rende il raccoglitore dei rifiuti molto meno aggressivo. Spiega perché non hai riscontrato questo problema durante il test con il debugger allegato. Notare che è possibile ottenere lo stesso risultato premendo Controllo + F5 in Visual Studio: avvierà l'applicazione senza allegare il debugger.

+0

Sono pienamente soddisfatto di questa risposta. Grazie – Przemen