Giới hạn tốc độ khung hình


9

Phần lớn game engine cạnh tranh thành công như thế id Tech, GoldSrc, Sourcevà như vậy cho phép hạn chế tốc độ khung hình.

Bạn có thể chơi với 30, với 60, với 99, với 72, với 68, v.v. Tóm lại, bạn có thể giới hạn và điều khiển nắp.

Tôi đã tự hỏi, làm thế nào để tôi hạn chế tốc độ khung hình?

Không quan tâm đến mã, nhưng lý thuyết.


Vì tò mò, điểm nào trong việc này ngoài việc giải phóng các chu kỳ cho các quy trình khác?
3Dave

1
@DavidLively, Hãy nghĩ về máy tính xách tay, những cái đó quá nóng rất dễ dàng với tốc độ khung hình rất cao, trong khi với giới hạn 60fps (dù sao cũng vô dụng, thậm chí 60 là hơi nhiều, 40 nên làm) họ có thể kiểm soát nhiệt độ tốt hơn nhiều.

Để chơi game cạnh tranh, tốt nhất là có tốc độ khung hình chẵn thay vì tăng đột biến trong khoảng từ 60 đến 100 khung hình / giây vì đôi khi một số hành động phụ thuộc vào tốc độ khung hình và không phụ thuộc vào thời gian, tốc độ khung hình bằng nhau cho phép bạn cảm nhận những hành động này. Btw lưu ý rằng nếu bạn kích hoạt VSync, trò chơi của bạn luôn có tốc độ khung hình tối đa bằng với tốc độ làm mới của bạn bởi vì (trình điều khiển đảm nhận việc này).
Roy T.

Câu trả lời:


7

Lý thuyết là: Kiểm tra lần cuối bạn kết xuất một khung hình và nếu chưa đến lúc vẽ một khung hình khác, thì đừng, và đợi cho đến khi nó xuất hiện.


8

Giả sử bạn muốn giới hạn tốc độ khung hình của mình ở mức 60fps, điều đó có nghĩa là mọi khung hình đều có thời gian kết xuất là 1 / 60s = 16,67ms (làm tròn)

Để giới hạn tốc độ khung hình của bạn, bạn chỉ cần kiểm tra thời gian khi bắt đầu vòng lặp trò chơi của mình, sau đó bạn có thể so sánh nó với thời gian ở cuối vòng lặp trò chơi: nếu chênh lệch nhỏ hơn 16,67ms, bạn nên dừng lại ở thời điểm đó.

Một cách để làm điều này là sử dụng:

sleep(waittime)

Tuy nhiên, vì sleep(x)mang lại luồng trong tối thiểu một phần xnghìn giây mà bạn không biết chắc chắn liệu mình có kịp kiểm soát hay không.

Một cách tốt hơn sẽ là sử dụng:

while(timediff < 16.67ms){ sleep(0); }

Điều này mang lại chủ đề và yêu cầu kiểm soát trở lại càng sớm càng tốt.

Một giải pháp khác là chỉ cần có một vòng chờ bận rộn, điều này cho phép bạn kiểm soát tốt nhất nhưng sử dụng CPU một cách không cần thiết.

Hãy nhớ rằng bộ lập lịch hệ điều hành luôn có thể lấy đi quyền kiểm soát từ luồng của bạn, vì vậy hãy chuẩn bị cho một số biến động.


"1/60" để rõ ràng. :)
Richard Marskell - Drackir

Giải pháp này thực sự tồi tệ. Nếu bạn đã bật vsync hoặc HĐH quyết định thực hiện công cụ, tốc độ khung hình của bạn sẽ dao động rất nhiều.
Tara

@Dudeson Tại sao nó xấu? (đây là kỹ thuật được sử dụng trong Quake3 btw). Nếu FPS của bạn thấp hơn 60, vòng lặp sẽ bị bỏ qua. Vì vậy, nó giữ FPS của bạn càng cao càng tốt nhưng không bao giờ trên 60.
Roy T.

@RoyT. Thú vị ... bạn lấy thông tin đó từ đâu? Từ mã nguồn? Ngoài ra, tôi đang nói chờ đợi trong một vòng lặp là xấu bởi vì đó chính xác là cách tôi đã làm nó trong động cơ của mình và nó gây cho tôi rất nhiều nỗi đau. Vấn đề là, khi bạn bật vsync (trong trình điều khiển GPU), bạn sẽ bị giảm nhiều khung hình nếu bạn cố gắng hạn chế tốc độ khung hình trong mã của mình, vì thời gian của bạn sẽ không hoàn hảo ở mọi khung hình. Tôi chỉ nói về vấn đề vsync. Không có vsync thì đây không phải là vấn đề. Và tôi không chắc liệu vsync có phải là loại thỏa thuận tương tự trong Quake 3 ngày như ngày hôm nay không.
Tara

@Dudeson một người khác đã chỉ ra điều đó cho tôi một thời gian trước bởi vì tôi lo lắng về sự bận rộn chờ đợi và ngủ. Tôi thấy bây giờ bạn có thể dao động trong khoảng 30fps và 60fps khi bật v-sync nếu bạn hơi bỏ lỡ nó. Nhưng tôi đoán điều đó xảy ra với bất kỳ kỹ thuật nào (đây không phải là điều FreeSync cố gắng giảm bớt). Tốc độ khung hình bị giới hạn bởi mã hoặc do máy tính của bạn không thể hiển thị ở tốc độ 60fps sẽ luôn có vấn đề này tôi nghĩ :)
Roy T.
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.