Dấu thời gian bán cố định hoặc hoàn toàn cố định?


15

Tôi đang thực hiện một shmup iphone và đang cố gắng quyết định loại vòng lặp trò chơi sẽ sử dụng. Tôi muốn sử dụng dấu thời gian bán cố định hoặc dấu thời gian cố định hoàn toàn.

Với dấu thời gian bán cố định, tôi sẽ thực hiện các cuộc gọi cập nhật 0 hoặc nhiều hơn (FIXED_INTERVAL) theo sau là một cuộc gọi cập nhật (dt) trong đó dt <= FIXED_INTERVAL trên mỗi vòng lặp trò chơi. Theo tôi hiểu, nhược điểm của phương pháp này là logic cập nhật vật lý (dt) của tôi sẽ khó lập trình hơn vì về cơ bản tôi phải giả sử một biến dt cho mỗi bản cập nhật. Và sau đó tôi cũng nghe nói rằng mỗi lần chạy trò chơi của tôi sẽ hơi khác nhau do các giá trị dấu phẩy động không giống nhau mỗi lần.

Sau đó, với dấu thời gian được cố định hoàn toàn, tôi thực hiện các cuộc gọi cập nhật 0 hoặc nhiều hơn (FIXED_INTERVAL) theo sau là một cuộc gọi nội suy (dt / FIXED_INTERVAL) trong đó dt <FIXED_INTERVAL trên mỗi vòng lặp trò chơi.

Vì vậy, có vẻ như quyết định lớn mà tôi thực sự phải đưa ra là: tôi có muốn giải quyết thách thức khi thực hiện cập nhật (dt) với một biến dt hay tôi muốn giải quyết thách thức khi thực hiện phép nội suy?

Bây giờ từ những gì tôi đã đọc, phần lớn mọi người đang nói sử dụng hoàn toàn cố định và thực hiện phép nội suy. Nhưng khi tôi nghĩ về việc thực hiện phép nội suy, có vẻ như tôi phức tạp hơn nhiều so với một bản cập nhật (dt) với biến dt. Điều này là do nếu tôi sử dụng phép nội suy, tôi phải nhớ cả trạng thái trước và trạng thái hiện tại. Vì vậy, nếu tôi muốn sử dụng phép nội suy, tôi phải đưa ra một lớp bổ sung bổ sung tóm tắt toàn bộ các trạng thái trò chơi riêng lẻ. Trong khi với dấu thời gian bán cố định mà tôi không phải sử dụng phép nội suy thì tôi không phải đưa ra một bản tóm tắt trạng thái trò chơi vì luôn chỉ có một trạng thái trò chơi và đó đơn giản là "mảng toàn cầu" đại diện cho kẻ thù và kẻ thù của tôi đạn v.v.

Vì vậy, lựa chọn thực tế hơn là gì: tôi có thực hiện bán cố định hay không khi biết rằng các cập nhật vật lý của tôi có thể trở nên phức tạp với biến dt. Hoặc tôi có sử dụng hoàn toàn cố định và cố gắng đưa ra một bản tóm tắt trạng thái trò chơi để tôi có thể theo dõi trạng thái trước đó và trạng thái hiện tại để thực hiện phép nội suy không?


Được bảo hiểm khá kỹ lưỡng tại đây: gamedev.stackexchange.com/questions/1589/NH
michael.bartnett

1
Tôi đã đọc cuộc thảo luận đó và các liên kết ở đó nhiều lần. Đó thực sự là cách tôi đến với bài viết này. Câu hỏi của tôi chủ yếu liên quan đến cách thực hiện các trạng thái trò chơi để đạt được phép nội suy - điều không được đề cập trong cuộc thảo luận đó.
Ryan

Câu trả lời:


12

Đã sửa hoàn toàn

Bạn mất hầu hết các lợi ích của dấu thời gian cố định khi bạn ném vào một bước thay đổi một lần mỗi khung.

Noel Lopis có một bài viết tuyệt vời về cách anh ấy thực hiện một bước thời gian cố định trong trò chơi Casey's Contraptions của mình . Như một phần thưởng cho bạn, anh ấy là một nhà phát triển iphone, mặc dù kỹ thuật của anh ấy không phải là dành riêng cho iphone.

Một số điểm nổi bật từ bài viết

  • Sử dụng một bộ tích lũy thời gian.
  • Sử dụng tốc độ vật lý 120Hz cho tốc độ khung hình 60Hz.
  • Mô phỏng một bước cố định trong tương lai và sử dụng tích lũy theo thời gian còn lại để rút mã vẽ giữa trạng thái vật lý hiện tại và trạng thái vật lý trong tương lai.
  • nhiều loại khác nhau

2

Những gì bạn gọi là dấu thời gian "bán cố định" và "cố định hoàn toàn", theo tôi, cả hai dấu thời gian cố định - dt mà bạn đang chuyển đến updatecuộc gọi của bạn không thay đổi giữa các khung.

Vì vậy, câu hỏi của bạn thực sự là "tôi có muốn thực hiện phép nội suy cho mục đích kết xuất không?" Câu trả lời là: có lẽ là không .

Nội suy là điều bạn chỉ muốn làm nếu dấu thời gian cố định của bạn updatekhác biệt rõ rệt với dấu thời gian đích của bạn render. Không có gì lạ khi các trò chơi có updategiai đoạn vất vả chỉ gọi updateở tần số 10Hz, nhưng hiển thị ở tốc độ khung hình đầy đủ.

Vì bạn đang viết shmup cho iPhone, nên bạn updatecũng không rendercần CPU đặc biệt; bạn có thể dễ dàng khóa tốc độ khung hình của mình thành 30Hz hoặc 60Hz, không bận tâm đến việc thực hiện và vẫn có một trò chơi mượt mà.


Tôi không hiểu Bạn đang nói rằng tôi có thể khóa dt lớn mà tôi sẽ tính toán trong vòng lặp trò chơi của mình - mà vật lý của tôi tiêu thụ? Làm thế nào để làm điều đó? Tôi có thể làm điều đó với CADisplayLink không? Ý tôi là, bạn đang sử dụng% CPU nào? Bạn có nên thực sự giả định dt vòng lặp trò chơi khóa?
Ryan

Điều tôi đang nói thực sự hiểu rõ điều này: làm điều ít phức tạp nhất sẽ làm việc.
Blair Holloway

1
Xây dựng: sử dụng một biến dtcho updaterenderlà điều đơn giản nhất sẽ hoạt động, nhưng thường tránh khi sử dụng các công cụ vật lý cho sự không ổn định mà nó gây ra. Do đó, gọi updatevới một cố định dtvà kết xuất ở cùng một tốc độ (trong khi giảm các khung nếu bạn updatechạy lâu) nói chung là điều đơn giản nhất sẽ hoạt động. Viết mã để nội suy các đối tượng giữa updatecác cuộc gọi làm tăng thêm độ phức tạp cho mã của bạn; sự phức tạp mà bạn đang thêm vào để giải quyết không có vấn đề cụ thể.
Blair Holloway
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.