Tốc độ khung hình có nên ảnh hưởng đến tốc độ trong một công cụ trò chơi?


7

Tôi đang viết một công cụ trò chơi 2D cho vui. Tôi có thể thực hiện hoạt hình bằng cách sử dụng công cụ. Tuy nhiên, nếu tôi thay đổi tốc độ khung hình (khung hình trên giây) thì tốc độ của hình ảnh động sẽ thay đổi.

Tôi chưa bao giờ sử dụng bất kỳ công cụ trò chơi. Tôi muốn biết liệu các công cụ trò chơi khác có xử lý vấn đề này hay không. Nếu không, tốc độ khung hình lý tưởng cho một trò chơi 2D là gì?

Câu trả lời:


13

Không, tốc độ khung hình không ảnh hưởng đến tốc độ - trò chơi sẽ hoàn toàn xoay quanh hiệu suất video của họ, điều này thật tai hại (ngay cả khi bạn giới hạn tốc độ, bạn không thể kiểm soát những người có hệ thống sẽ chạy trò chơi ở tốc độ một nửa).

Bạn đang gặp phải vấn đề này vì bạn đã làm sai điều gì đó: Các thói quen cập nhật / kết xuất của bạn chạy hết lần này đến lần khác càng nhanh càng tốt, với các đối tượng cập nhật trên cơ sở mỗi cuộc gọi (do đó khi tốc độ cuộc gọi bị lệch, thì tốc độ cuộc gọi cũng vậy).

Cách tiếp cận dựa trên thời gian

Cách chính xác để làm điều này là cập nhật các đối tượng trên cơ sở mỗi giây .

Ví dụ, hãy xem xét một viên đạn: Ngay bây giờ, nó có thể biết nó cần bao nhiêu để di chuyển trên mỗi khung hình. Bạn cần biến điều này thành bao nhiêu nó di chuyển mỗi giây . Làm thế nào bạn làm điều đó thực sự không quá phức tạp.

Đầu tiên, viên đạn của bạn sẽ được cập nhật nhiều hơn một lần mỗi giây, vì vậy chúng tôi cần thực sự cập nhật nó cứ sau vài mili giây. Mỗi lần bạn cập nhật công cụ vật lý của mình, một số mili giây nhất định đã trôi qua kể từ lần cập nhật cuối cùng: đây được gọi là thời gian delta , thường là dt . Dt được xác định trước khi cập nhật tất cả các đối tượng, sau đó tất cả các đối tượng cập nhật bằng cách sử dụng cùng một dt để giữ đồng bộ. Dt thường được truyền dưới dạng đối số cho từng đối tượng trong lệnh gọi cập nhật của nó.

Trong vật lý bước cố định, dt là một số cố định, trong khi trong vật lý bước biến, dt thay đổi tùy thuộc vào lượng thời gian thực tế kể từ lần cập nhật cuối cùng (do đó tên của chúng).

Điều đó đưa chúng tôi trở lại viên đạn của bạn. Nó được yêu cầu cập nhật với tốc độ 16 mili giây, đối với động cơ vật lý được cập nhật 60 lần mỗi giây: nếu viên đạn di chuyển 12 mét mỗi giây, bạn di chuyển nó (16.0/1000.0) * 12.0trong mét trong bản cập nhật này.


4
Cách tiếp cận này không lý tưởng vì nhiều lý do. Gameplay sẽ không mang tính quyết định, khiến việc đồng bộ nhiều người chơi trở nên khó khăn hơn nhiều so với mức cần thiết. Nếu tốc độ cập nhật chậm lại đủ, các đối tượng có thể vượt qua các rào cản hoặc va chạm sẽ xảy ra có thể được bỏ qua.
Tấn

Đó là lý do tại sao thời gian trôi qua (dt) có thể được kẹp, nghĩa là từ các khung hình mỗi giây 5 - 1000, động cơ của bạn hoạt động chính xác. Dưới 5 khung hình / giây, bạn sẽ có được thời gian chậm lại (tức là dt được kẹp).
giảm tốc

@Daniel, Nó vẫn không mang tính quyết định, làm cho mô phỏng mạng được đồng bộ hóa hoặc hệ thống phát lại khó thực hiện hơn nhiều. Và nếu bạn định tạo một trò chơi giải đố loại Rube Goldberg, sau vài giây, mô phỏng sẽ không phát lại theo cùng một cách mỗi lần.
Tấn

À, vì một số lý do, tôi nghĩ rằng anh ta đang sử dụng một bước thời gian cố định với bước dt ... Vì vậy, yoir đúng, điều này là xấu.
giảm tốc

5
Công bằng mà nói, cách tiếp cận này là quá đủ tốt cho bất cứ điều gì không thực hiện vật lý phức tạp, và đã làm việc trong nhiều trò chơi vận chuyển. Vì vậy, tốt nhất đừng quá lo lắng về việc cần bước thời gian cố định và kết xuất nội suy, v.v.
Kylotan

10

Cách tốt nhất để làm cho trò chơi của bạn chạy cùng tốc độ trên tất cả các hệ thống là sử dụng Dấu thời gian cố định.

Với dấu thời gian cố định, trò chơi sẽ luôn cập nhật với cùng tốc độ, bất kể tốc độ kết xuất là bao nhiêu và khi sử dụng phép nội suy, nó sẽ trông mượt mà ngay cả khi tốc độ kết xuất cao hơn nhiều so với tốc độ cập nhật.

Dưới đây là câu trả lời với các tài nguyên về cách thực hiện dấu thời gian cố định.
Dấu thời gian bán cố định hoặc hoàn toàn cố định?

Dưới đây là một câu trả lời giải thích cách thực hiện phép nội suy cho chuyển động và biến đổi.
Làm thế nào để nội suy giữa hai trạng thái trò chơi?


-2

Không, không nên. Một loại thời gian bạn có thể làm trong trò chơi của mình là thời gian dựa trên khung. Ý tưởng là để cho vòng lặp trò chơi chạy nhanh như máy tính của bạn có thể chạy nó do đó có trải nghiệm tổng thể tuyệt vời và bạn kiểm soát tốc độ mô phỏng của mình chạy. Bây giờ bạn đã tách bản cập nhật của mình khỏi kết xuất và có quyền kiểm soát chính xác đối với nó.

Trong trường hợp này, vòng lặp trò chơi của bạn có thể chạy ở tốc độ 60 khung hình / giây trên một máy và có thể 45 hoặc một cái gì đó khác trên máy khác, nhưng mô phỏng của bạn sẽ luôn chạy ở tốc độ được chỉ định chính xác giữa chúng.

Trò chơi của bạn bây giờ được chia thành hai phần, một phần để kết xuất đồ họa của bạn và phần còn lại để cập nhật mô phỏng của bạn. Bạn đặt tốc độ mô phỏng mong muốn khi bắt đầu trò chơi và ở đầu vòng lặp trò chơi của bạn, bạn sẽ có được thời gian trôi qua. Lưu ý, thời gian trôi qua này là một lượng thời gian dựa trên tốc độ mô phỏng mong muốn của bạn. Giá trị này sau đó được sử dụng như một số nhân so với các đối tượng trò chơi của bạn để giữ cho chúng di chuyển ở / hoặc rất gần với tốc độ mô phỏng mong muốn của bạn. Ví dụ: nếu bạn muốn mô phỏng của mình cập nhật ở tốc độ 30 khung hình / giây và vòng lặp trò chơi của bạn hiện đang chạy ở tốc độ 60 khung hình / giây, giá trị thời gian đã trôi qua cho khung này sẽ là 0,5. Khi bạn nhân số này với tốc độ của các vật thể chuyển động của bạn, nó sẽ khiến chúng di chuyển với tốc độ 30 khung hình / giây. Biết rằng từ khung hình này sang khung hình khác, tốc độ vòng lặp trò chơi của bạn sẽ thay đổi rất nhiều và thời gian cơ sở khung hình có thể giữ cho mô phỏng của bạn chạy ở tốc độ đã biết và có thể dự đoán được.

Kết quả là hoạt hình mượt mà.


1
-1 Đây chỉ là các cập nhật bước cố định (như được giải thích trong câu trả lời của tôi và của AttackHobo), ngoại trừ những thứ ở tốc độ trên mỗi khung hình thay vì bất kỳ biện pháp trực quan nào như mỗi giây. Nếu bạn sẽ đi xa đến thế, đây chỉ là một bước nhỏ để thực hiện mọi việc trên cơ sở mỗi giây và tiết kiệm cho bạn tất cả các phép tính số học tinh thần không trực quan giữa tốc độ mỗi giây và tốc độ trên khung hình (và làm cho mọi thứ trở nên đơn giản hơn nếu bạn tình cờ thay đổi tốc độ khung hình của bạn).
doppelgreener
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.