2013-07-11 18 views
6

私はWindows Phone(XNA)のための最初のゲームを作っています。 (加速度計は、この関数内でのみ宣言されたローカル変数であることに注意)ここでWindows Phone 8 Accelerometerのイベント

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 Emulatorとコンピュータに接続され、Visual Studioから起動しているNokia 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

関連する問題