2013-07-11 2 views
6

Я делаю свою первую игру для Windows Phone (XNA). Я использую акселерометр, чтобы изменить положение перекрестия на экране:Windows Phone 8 События акселерометра

Position of crosshair

Вот код в моем Initialize() функции (обратите внимание, что акселерометр локальная переменная объявлена ​​только в этой функции):

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, а также на моем Nokia Lumia 520, подключенном к компьютеру и запущенном из Visual Studio, однако, когда я запускаю игру в телефоне (не подключен к компьютеру), событие accelometer_CurrentValueChanged вызывается только один раз, по заявлению запускать.

Мое решение было сделать акселерометр член моего класса Game, то код в Initialize(), как это:

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

Так что мой вопрос, почему делает эту работу решение? И почему существует разница между приложением, запущенным с VS и обычно, даже на том же устройстве?

ответ

6

Почему это решение работает?

Это решение работает, потому что вы держите ссылку на акселерометр. Приложения Windows Phone, как и все приложения .NET, используют автоматизированную систему управления памятью. Фоновый процесс, называемый сборщиком мусора, регулярно проверяет объекты, обнаруживает тех, кто больше не ссылается, и очищает их. Если вы укажете акселерометр в качестве локальной переменной, больше не будет называться, когда функция выйдет, и поэтому будет очищена. Когда вы объявляете его членом вашего класса, он будет жив до тех пор, пока ваш класс живет.

Почему разница между приложением, запущенным с VS и обычно, на том же устройстве?

При запуске кода из Visual Studio прилагается отладчик. Чтобы помочь вам отлаживать, это влияет на способ выполнения кода. Примечательно, что это делает сборщик мусора менее агрессивным. Это объясняет, почему у вас не было этой проблемы при тестировании с прикрепленным отладчиком. Обратите внимание, что вы можете добиться того же результата, нажав Управление + F5 в Visual Studio: оно запустит приложение без прикрепления отладчика.

+0

Я полностью удовлетворен этим ответом. благодаря – Przemen