2013-07-11 42 views
6

Tôi đang tạo trò chơi đầu tiên cho Windows Phone (XNA). Tôi sử dụng gia tốc kế để thay đổi vị trí của một crosshair trên màn hình:Sự kiện tăng tốc Windows Phone 8

Position of crosshair

Dưới đây là mã trong Initialize của tôi() chức năng (lưu ý rằng gia tốc là biến cục bộ chỉ khai báo trong hàm này):

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

Và xử lý sự kiện:

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

này hoạt động tốt trên Trình giả lập Windows Phone và trên Nokia Lumia 520 được kết nối với máy tính và khởi chạy từ Visual Studio, tuy nhiên khi tôi khởi chạy trò chơi trong điện thoại (không kết nối với máy tính), sự kiện accelerometer_CurrentValueChanged dường như chỉ được gọi một lần, trên ứng dụng khởi động.

Giải pháp của tôi là làm cho gia tốc một thành viên của lớp game của tôi, sau đó mã trong Initialize() như thế này:

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

Vì vậy, câu hỏi của tôi là, tại sao việc giải pháp này? Và tại sao có sự khác biệt giữa ứng dụng được khởi chạy từ VS và thông thường, ngay cả trên cùng một thiết bị?

Trả lời

6

Tại sao giải pháp này hoạt động?

Giải pháp này hoạt động vì bạn đang giữ tham chiếu đến gia tốc kế. Các ứng dụng Windows Phone, giống như tất cả các ứng dụng .NET, sử dụng một hệ thống tự động để quản lý bộ nhớ. Một quá trình nền, được gọi là thu gom rác thải, kiểm tra các đối tượng một cách thường xuyên, phát hiện những người không được tham chiếu nữa, và làm sạch chúng. Nếu bạn khai báo gia tốc kế như một biến cục bộ, nó sẽ không được tham chiếu nữa khi chức năng thoát, và do đó sẽ được làm sạch. Khi bạn tuyên bố nó là một thành viên của lớp học của bạn, nó sẽ được sống miễn là lớp học của bạn sống.

Tại sao sự khác biệt giữa ứng dụng được khởi chạy từ VS và thông thường, trên cùng một thiết bị?

Khi khởi chạy mã từ Visual Studio, trình gỡ rối được đính kèm. Để giúp bạn gỡ lỗi, nó có một số tác động đến cách mã thực thi. Đáng chú ý, nó làm cho cách thu gom rác kém tích cực hơn. Nó giải thích lý do tại sao bạn không có vấn đề này khi thử nghiệm với trình gỡ lỗi đính kèm. Lưu ý rằng bạn có thể đạt được kết quả tương tự bằng cách nhấn Điều khiển + F5 trong Visual Studio: ứng dụng sẽ khởi động ứng dụng mà không cần đính kèm trình gỡ rối.

+0

Tôi hoàn toàn hài lòng với câu trả lời này. Cảm ơn – Przemen

Các vấn đề liên quan