Vòng lặp trò chơi XNA Cập nhật và Vẽ


7

Tôi bối rối về cách các phương thức của trò chơi được gọi và khi nào.

Vì vậy, tôi đọc rằng trình tự là:

  1. Khởi tạo
  2. LoadContent
  3. Cập nhật
  4. Vẽ tranh
  5. UnloadContent

Trong đó 3 và 4 là vòng lặp trò chơi, vì vậy sau khi Updateđược gọi, Drawđược gọi, sau đó Update, sau đó Draw, v.v. Vòng lặp trò chơi (Cập nhật và Vẽ) được thực hiện 60 lần mỗi giây.

Sau đó tôi đọc ở một nơi khác UpdateDrawcó thể được gọi vào những thời điểm khác nhau và Updatecó thể được gọi nhiều hơn một lần trước đó Drawvà cứ thế.

... và cuối cùng UnloadContentđược gọi sau Updatenếu Exitphương pháp được gọi.


60 khung hình mỗi giây giả định rằng isFixedTimeStep được đặt thành true, theo mặc định là như vậy. Bạn có thể đặt thành sai nếu bạn muốn đạt được hiệu suất cao nhất từ ​​PC hoặc để đo điểm chuẩn chung.
ChrisC

Câu trả lời:


11

Thực tế, có hai cách mà XNA có thể thực hiện vòng lặp trò chơi, Bước cố định và Bước biến. Khi bạn thiết lập trò chơi của mình để chạy Bước cố định, nó sẽ liên tục gọi phương thức Cập nhật dựa trên thời gian trò chơi đã trôi qua được nhắm mục tiêu. Vì vậy, cho dù máy tính của bạn có nhanh đến mức nào, nó sẽ luôn gọi phương thức Cập nhật trong cùng khoảng thời gian trò chơi đã trôi qua, vì vậy Cập nhật và Vẽ sẽ được gọi liên tiếp như bạn mô tả. Tuy nhiên, nếu trò chơi của bạn tình cờ chạy chậm, XNA sẽ bắt đầu gọi phương thức Cập nhật nhiều lần trước phương thức Vẽ, để "bắt kịp".

Mặt khác, Bước biến không cố gắng "theo kịp" hoặc thực hiện nhiều cuộc gọi phương thức Cập nhật trước khi gọi phương thức Draw, nếu trò chơi đang chạy chậm.

EDIT: Bài đăng mẫu đẹp giải thích Bước cố định và Bước biến đổi có chiều sâu hơn nhiều. gamedev.net


6
Tôi đã tìm thấy lời giải thích tốt nhất về cách thức hoạt động (đối với tôi) ở đây: Tìm hiểu về GameTime - Blog Shawn Hargreaves
Richard Marskell - Drackir

Cảm ơn, nhưng tôi chưa hiểu nếu thời điểm 16 triệu. giữa mỗi cuộc gọi là cho tất cả các vòng lặp trò chơi hoặc dành cho Cập nhật và sau đó là phương thức Vẽ.
xdevel2000

@ xdevel2000, vòng lặp trò chơi chỉ là phương thức Cập nhật và Vẽ. Nhưng bạn có thể gọi các phương thức khác trong các phương thức Cập nhật và Vẽ, tất cả chúng sẽ trở thành một phần của vòng lặp trò chơi.
Cooper

@Neeko, có nhưng bạn không trả lời câu hỏi của tôi! Xin vui lòng, tôi hỏi bạn nếu 16 millis. dành cho từng phương thức hoặc dành cho tất cả các vòng lặp trò chơi (Cập nhật và Vẽ). Cảm ơn.
xdevel2000

@ xdevel2000 Xin lỗi vì tôi đã trả lời câu hỏi này hơn một năm sau, nhưng tôi chỉ nhận thấy câu hỏi này! 16ms dành cho toàn bộ chu trình vòng lặp trò chơi. Không phải cho mọi phương pháp được gọi trong chu kỳ đó.
Cooper

0

Trừ khi bạn đang viết một trò chơi cho Windows và bạn đang tải nội dung không được quản lý, đừng lo lắng về UnloadContent. Nếu tất cả những gì bạn đang làm là vẽ bằng SpriteBatch và có thể chơi các đối tượng SoundEffect và Song, hãy quên UnloadContent () ngay bây giờ.

Đối với Cập nhật và Vẽ, khi bạn bắt đầu với XNA, chỉ cần nghĩ rằng XNA Framework sẽ tự động gọi Cập nhật, sau đó Vẽ, sau đó Cập nhật, rồi Vẽ ... và cứ thế. Có ngoại lệ không? Đúng. Bạn có cần phải lo lắng về chúng khi bạn bắt đầu? Không, trừ khi bạn là một nhà phát triển trò chơi có kinh nghiệm. Nếu vậy, hãy chấp nhận lời xin lỗi của tôi ...

Nếu trò chơi của bạn sử dụng Bước thời gian cố định, thì trò chơi sẽ trì hoãn để vòng lặp này không đi nhanh hơn bước thời gian. Các dự án Windows Phone thêm vào một dòng mã để sửa lỗi trò chơi thành 30 khung hình / giây. Bạn sẽ tìm hiểu một chút về điều đó bằng cách không làm gì khác hơn là tạo một dự án Windows Game hoàn toàn mới và sau đó là một dự án Windows Phone Game hoàn toàn mới. Tìm kiếm một dòng mã trên dự án Windows Phone để sửa bước thời gian.

Các bình luận ở trên để xem bài viết của Shawn Hargreaves là tại chỗ. Trên thực tế, anh ấy là nguồn nếu bạn muốn nhà phát triển thẳng thắn nói về khung XNA. Đó là một vài năm bài viết để đi qua, nhưng đó là một tài nguyên tốt.


1
Để mở rộng một chút trên UnloadContent, điều đó có nghĩa là áp dụng cho Trình quản lý nội dung mặc định mà đối tượng Trò chơi cung cấp. Bạn có thể tự tạo Trình quản lý nội dung mới để tải và quản lý các nội dung khác nhau trong các trò chơi của mình, nhưng trong trường hợp này không cần thiết. ContentManager mặc định được xử lý khi Game thoát, sau đó tự động tải nội dung.
ChrisC

-2

Tôi không biết cách thay đổi thứ tự, nhưng Cập nhật và Vẽ chỉ là các chức năng để bạn có thể gọi chúng từ những nơi khác - mặc dù tôi không thể nghĩ đến việc sử dụng thứ này. Theo nguyên tắc chung, bạn sẽ chỉ sử dụng Cập nhật, Vẽ, Cập nhật, Vẽ, v.v. như bạn đã nói.

Unload được gọi sau khi chức năng thoát được gọi là có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.