Làm thế nào để thực thi logic trò chơi cứ sau 100ms nhưng kết xuất càng nhanh càng tốt?


7

Tôi đã tạo ra một bản sao rắn đơn giản và muốn thực hiện logic trò chơi cứ sau 100ms trong khi hiển thị nhanh nhất có thể. Làm thế nào tôi có thể đạt được điều này khi chương trình có thể chạy với tốc độ khung hình rất khác nhau?

Ví dụ, khi biên dịch mã thành một tệp thực thi riêng, tôi có hơn 1000 trong đó tôi chỉ có thể đợi cho đến khi 100ms được thông qua trước khi thực hiện bước logic tiếp theo. Nhưng khi biên dịch thành asm.js, tôi nhận được tốc độ khung hình khoảng 20, có nghĩa là khoảng thời gian giữa hai bước logic có thể là tất cả mọi thứ từ 100ms đến 149ms sẽ dẫn đến tình trạng nói lắp có thể nhìn thấy (một chuyển động nhanh hơn chuyển động khác).


Bạn đã nghiên cứu các dấu thời gian cố định và dấu thời gian thay đổi?
MichaelHouse


Bạn có thể sử dụng InvokeRepeat để kích hoạt chức năng và lặp lại nó với tỷ lệ đặc biệt
Sata

InvokeRepeatingđường nối là một tính năng Unity hoặc maby C # nhưng tôi đang sử dụng C. Tuy nhiên, xin cảm ơn :)
ooxi

Tại sao bạn muốn kết xuất nhanh hơn bước cập nhật của mình? Nếu không có gì thay đổi, tại sao phải cập nhật màn hình?
Niels

Câu trả lời:


2

Đây là một số ví dụ cơ bản về tính toán của khung hình.
Tôi giả sử rằng có một hàm được gọi là current_milliseconds()trả về số mili giây từ đầu chương trình.

/* Before the loop */
int time = current_milliseconds(); // Setting up the Timer
int FPS = 60;

/* Inside the loop (at the bottom) */
int frame_ms = current_milliseconds() - time; // Milliseconds the frame took to render
// Calculating the number of frames the machine could render in 1 second at that speed
FPS = 1000.0 / (frame_ms <= 0 ? 1 : frame_ms);
time = current_milliseconds();

Lời khuyên của tôi từ kinh nghiệm cá nhân: KHÔNG giới hạn tốc độ khung hình bằng tay. Tốt hơn hết là bạn nên kiểm tra thời gian kết xuất của từng khung và điều chỉnh logic trò chơi của mình cho phù hợp.
Một giải pháp khác là sử dụng vSync để có tốc độ khung hình không đổi.


"Tốt hơn là bạn nên kiểm tra thời gian kết xuất của từng khung và điều chỉnh logic trò chơi của mình cho phù hợp" - điều này phụ thuộc một cách hợp lý vào các tiêu chí được sử dụng để xác định "tốt hơn". Nếu một trong những tiêu chí của bạn là hành vi xác định để giảm thiểu đồng bộ hóa giữa nhiều khách hàng hoặc nếu bạn muốn chơi trò chơi nhất quán trên một loạt các thiết bị với hiệu suất khác nhau, thì chạy logic trò chơi ở tốc độ khung hình không nhất thiết phải tốt hơn và thực tế có thể làm cho nó khó hơn để đáp ứng những mục tiêu này.
DMGregory

@DMGregory Tôi chỉ nói rằng việc đóng gói khung hình bằng tay với độ trễ là khủng khiếp và sẽ không mang lại cho bạn kết quả như bạn muốn, vì vậy hoặc bạn sử dụng một số thư viện có giới hạn tốc độ khung hình hoặc bạn sử dụng vsync, nếu bạn cần tốc độ khung hình cố định
Xriuk
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.