Lợi ích của giới hạn khung mỗi giây là gì? (Nếu có)


13

Tôi đang làm việc với một trò chơi đơn giản trong OpenGL, sử dụng SDL để khởi tạo và nhập dữ liệu, và nó xuất hiện theo thời gian tôi có hai tùy chọn có sẵn cho tôi. Số một chỉ đang ngủ cho tối ưu hóa thời gian tối ưu - theTimeTakenToRender, khi tối ưu hóa thời gian trong giây = 1 / theFram CảCap. (Tôi không hoàn toàn chắc chắn liệu điều này có cần thiết hay không, vì nó tương đương với việc sử dụng vsync, điều này có thể chính xác hơn. để kích hoạt nó.) Cái khác là đo thời gian kể từ khi khung cuối cùng được hiển thị và chỉ điều chỉnh chuyển động cho phù hợp. (Thời gian ngắn hơn để hiển thị một khung, các thực thể di chuyển càng xa trong khung đó). Về mặt hiệu suất, và giảm nhấp nháy, vv, những lợi thế và bất lợi của hai phương pháp này là gì?

Câu trả lời:


15

Nếu thời gian khung hình của bạn không thể đoán trước được (dù đây có phải là lỗi của bạn hay không, hệ điều hành có thể thỉnh thoảng sử dụng tài nguyên, v.v.), việc giới hạn tốc độ khung hình có thể dự đoán thấp hơn một chút so với tốc độ khung hình có thể đạt được của bạn sẽ làm rất nhiều cho độ trễ có thể dự đoán được . làm cho trò chơi cảm thấy tốt hơn rất nhiều

Thay đổi khoảng thời gian giữa khi bạn xử lý đầu vào và kết xuất các thay đổi liên quan đến đầu vào đó có thể cảm thấy tồi tệ - ngay cả khi trung bình bạn đạt được độ trễ ít hơn giữa hai người, "jitter" có thể đáng chú ý đối với con người (một cách có ý thức hoặc vô thức).

Xem bản trình bày Microsoft GameFest What in a Frame: Tear, Độ trễ và Tốc độ khung hình để biết thêm thông tin chi tiết tại đây. Carmack cũng có một loạt các bài đăng blog hữu ích trong việc này.

Ngoài ra, hãy lưu ý rằng một số phép toán có thể bị hỏng khi bạn chạy các khung bằng cách sử dụng các deltaTgiá trị thấp - hoặc thậm chí khi bạn sử dụng biến số deltaT(mọi thứ có thể trở nên khó hơn hoặc thậm chí không thể thực hiện theo cách "ổn định" và có thể dự đoán được, điều này rất quan trọng đối với mọi thứ như replay và một số hình thức đồng bộ hóa mạng). Xem Fix Timestep của bạn để biết một số cái nhìn sâu sắc ở đây.


1
(Bằng cách này, tôi rất muốn khuyên không đóng nắp bằng cách "ngủ"; con số ra những gì tình hình vsync của bạn nằm trên nền tảng của bạn và sử dụng vsync để lái xe bạn Đó là nhiều dự đoán hơn và thường sử dụng các nguồn lực ít hơn..)
leander

Cảm ơn, tôi chắc chắn sẽ cố gắng để đạt được tốc độ khung hình. Bạn có biết cách bật vsync bằng SDL không?
w4etwetewtwet

1
Trong SDL 2.0, bạn có thể bật vsync bằng cách truyền SDL_RENDERER_PRESENTVSYNC cờ để SDL_CreateRenderer cuộc gọi, ví dụSDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
TJS

12

Cuối cùng, bạn sẽ sử dụng ít CPU hơn (nhiều tác vụ sẽ cảm ơn bạn) và mọi người trên thiết bị di động cũng sẽ đánh giá cao điều này.


4
Chưa kể việc sử dụng năng lượng thấp hơn (quan trọng đối với thiết bị di động / máy tính xách tay) và ít sinh nhiệt hơn.
zeel

Nó làm tôi nhớ một số vấn đề về trò chơi, khi FPS trong menu không giới hạn và cực kỳ cao, tương đương 900 khung hình / giây và điều đó thực sự làm căng thẳng CPU / GPU -> temp cao hơn -> nhiều tiếng ồn hơn.
Kromster nói hỗ trợ Monica

10

Bạn không bao giờ nên, không bao giờ, bao giờ, bao giờ, sử dụng Ngủ để kiểm soát tốc độ khung hình .

Điều này đã được đưa ra trước đây và tôi sẽ giới thiệu cho bạn câu hỏi khác để thảo luận về lý do tại sao. Một điều không được đề cập ở đây là ở tốc độ làm mới hiện đại điển hình là 60Hz và với độ chi tiết 1 mili giây điển hình của các cuộc gọi Ngủ, thực sự không thể Ngủ trong khoảng thời gian chính xác giữa các khung.

Tôi không nói rằng việc mang lại CPU nếu bạn không có gì để làm là một điều tồi tệ; cách xa nó. Nhưng nó không giống như kiểm soát tốc độ khung hình và Ngủ là một giải pháp phù hợp với cái trước nhưng không phải cái sau.

Thay vào đó, hãy kiểm tra thời gian đã trôi qua và nếu đã đến lúc chạy một khung hình, thì hãy làm điều đó, nếu không - và nếu bạn muốn mang lại một số CPU - Ngủ trong thời gian tối thiểu - 1 mili giây. Cũng đảm bảo rằng bộ hẹn giờ ngủ của bạn được thiết lập phù hợp cho nền tảng của bạn để cung cấp cho bạn độ phân giải tốt; tức là khi bạn thực hiện cuộc gọi "Ngủ (1)" đó, bạn thực sự có cơ hội thực sự Ngủ trong 1 mili giây, thay vì một cái gì đó như 15, 20 hoặc 30 (sẽ là trường hợp khác). Tôi tin rằng SDL sẽ tự động làm điều này cho bạn.

Bạn cũng có thể xây dựng một số chùng vào nó, để nếu gần đến giờ chạy khung, bạn dừng Ngủ và bắt đầu chạy thẳng cho đến khi khung chạy, điều này có thể giúp bạn đạt được khoảng thời gian khung mong muốn chính xác hơn.

Điều này cuối cùng trông giống như một loạt các cuộc gọi Ngủ (1) xen kẽ với khung thỉnh thoảng và điều đó ổn. Bạn vẫn đang từ bỏ CPU khi bạn không cần nó, nhưng khung của bạn vẫn có thể chạy đúng giờ.



0

Như đã đề cập trước đó, nó làm giảm việc sử dụng CPU. Trên flipside, và ngày càng quan trọng, điều đó cũng làm cạn kiệt tuổi thọ pin. Một ví dụ điển hình, FTL chạy ở mức gần 100% CPU trong MBA của tôi. Kết quả là, nó làm cạn kiệt pin trong> 2 giờ và chạy rất nóng. (Kết quả trực tiếp hơn, tôi đã gỡ cài đặt và không còn chơi nữa ...). Một nắp khung sẽ ngăn chặn điều này.

Một lợi thế khác không được đề cập là, nếu là một trò chơi nhiều người chơi, bạn cũng san bằng sân chơi bằng cách cho mọi người cùng trải nghiệm.


Vòng lặp cập nhật tốc độ khung hình và khung hình của bạn không cần phải chạy ở cùng một tốc độ, do đó, mang lại cho mọi người trải nghiệm tương tự không chỉ dựa vào tốc độ khung hình.
Thomas
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.