ข้อ จำกัด เฟรมโหลด


9

ที่ประสบความสำเร็จมากที่สุดเครื่องมือเกมการแข่งขันชอบid Tech, GoldSrc, Sourceและเช่นอนุญาตให้มีข้อ จำกัด framerate

คุณสามารถเล่นกับ 30 กับ 60 กับ 99 กับ 72 กับ 68 ฯลฯ ในระยะสั้นคุณสามารถ cap มันและควบคุมหมวก

ฉันสงสัยว่าฉันจะ จำกัด อัตราเฟรมอย่างไร

ไม่สนใจรหัส แต่เป็นทฤษฎี


นอกเหนือจากความอยากรู้แล้วอะไรคือสิ่งที่นอกเหนือไปจากการเพิ่มวงจรสำหรับกระบวนการอื่น ๆ
3 ต.ค.

1
@DavidLively ลองนึกถึงแล็ปท็อปคนที่ร้อนจัดง่ายมากในอัตราเฟรมที่สูงมากในขณะที่มี 60fps (ยิ่งไม่มีประโยชน์อยู่ดีอีกต่อไปแม้ 60 จะน้อยมาก 40 ควรทำ) พวกเขาสามารถควบคุมอุณหภูมิได้ดีกว่ามาก

สำหรับเกมการแข่งขันที่ดีที่สุดที่จะมีอัตราเฟรมที่เท่ากันมากกว่า spikes ระหว่าง 60 และ 100 fps เพราะบางครั้งการกระทำบางอย่างขึ้นอยู่กับอัตราเฟรมและไม่ขึ้นอยู่กับเวลาอัตราเฟรมที่เท่ากันช่วยให้คุณรู้สึกถึงการกระทำเหล่านี้ Btw โปรดทราบว่าหากคุณเปิดใช้งาน VSync เกมของคุณจะมีความเร็วสูงสุดต่อวินาทีเท่ากับอัตราการรีเฟรชของคุณเพราะ (คนขับจะดูแลสิ่งนี้)
Roy T.

คำตอบ:


7

ทฤษฏีคือ: ตรวจสอบเมื่อคุณแสดงเฟรมสุดท้ายและถ้ายังไม่ถึงเวลาที่จะวาดอีกเฟรมอย่าทำแล้วรอจนกระทั่งมันเป็น


8

สมมติว่าคุณต้องการ จำกัด framerate ของคุณเป็น 60fps ซึ่งหมายความว่าทุกเฟรมมีเวลาเรนเดอร์ 1 / 60s = 16,67ms (ปัดเศษ)

ในการ จำกัด อัตราเฟรมของคุณคุณเพียงตรวจสอบเวลาที่เริ่มลูปเกมของคุณคุณสามารถเปรียบเทียบกับเวลาเมื่อสิ้นสุดลูปเกม: หากความแตกต่างน้อยกว่า 16.67ms คุณควรหยุดในเวลานั้น

วิธีหนึ่งในการทำเช่นนี้คือการใช้:

sleep(waittime)

อย่างไรก็ตามตั้งแต่ sleep(x)ให้เธรดอย่างน้อยxเสี้ยววินาทีคุณไม่ทราบแน่ชัดว่าคุณจะได้รับการควบคุมย้อนหลังเวลาหรือไม่

วิธีที่ดีกว่าคือการใช้:

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

สิ่งนี้ทำให้เธรดและร้องขอการควบคุมกลับมาโดยเร็วที่สุด

วิธีแก้ปัญหาอื่นก็คือมีการวนรอบการรอที่ยุ่งซึ่งจะช่วยให้คุณควบคุมได้ดีที่สุด แต่ใช้ CPU โดยไม่จำเป็น

โปรดจำไว้ว่าตัวกำหนดตารางเวลาระบบปฏิบัติการสามารถควบคุมส่วนต่าง ๆ ได้จากเธรดของคุณดังนั้นเตรียมพร้อมสำหรับความผันผวนบางอย่าง


"1 / 60s" เพื่อให้ชัดเจน :)
Richard Marskell - Drackir

วิธีนี้ไม่ดีจริงๆ หากคุณเปิดใช้งาน vsync หรือระบบปฏิบัติการตัดสินใจทำสิ่งต่าง ๆ อัตราเฟรมของคุณจะผันผวนมาก
ธารา

@Dudeson ทำไมมันไม่ดี? (นี่คือเทคนิคที่ใช้ใน Quake3 btw) หาก FPS ของคุณต่ำกว่า 60 การวนซ้ำก็จะถูกข้ามไป ดังนั้นมันจึงทำให้ FPS ของคุณสูงที่สุดเท่าที่จะเป็นไปได้ แต่ไม่สูงกว่า 60
Roy T.

@RoyT น่าสนใจ ... คุณได้รับข้อมูลนั้นจากที่ไหน จากซอร์สโค้ดหรือไม่ นอกจากนี้ฉันกำลังบอกว่าการรอในวงนั้นไม่ดีเพราะนั่นเป็นสิ่งที่ฉันทำในเครื่องยนต์และมันทำให้ฉันเจ็บปวดมาก ปัญหาคือเมื่อคุณเปิด vsync (ในไดรเวอร์ GPU) คุณจะได้รับเฟรมจำนวนมากถ้าคุณพยายาม จำกัด อัตราเฟรมในโค้ดของคุณด้วยเพราะ Timinig ของคุณจะไม่สมบูรณ์แบบทุกเฟรม ฉันแค่พูดถึงปัญหา vsync หากไม่มี vsync นี่ไม่ใช่ปัญหา และฉันไม่แน่ใจว่า vsync เป็นข้อตกลงประเภทเดียวกันใน Quake 3 วันเหมือนกับที่เป็นอยู่ในปัจจุบันหรือไม่
ธารา

@Dudeson คนอื่นชี้ให้ฉันเห็นเมื่อไม่นานมานี้เพราะฉันกังวลเกี่ยวกับการรอคอยและการนอนหลับที่วุ่นวาย ตอนนี้ฉันเห็นแล้วว่าคุณสามารถเปลี่ยนแปลงได้ระหว่าง 30fps และ 60fps เมื่อ v-sync เปิดถ้าคุณพลาดเล็กน้อย แต่ฉันเดาว่าจะเกิดขึ้นกับเทคนิคใด ๆ (ไม่ใช่สิ่งที่ FreeSync พยายามบรรเทา) framerate จำกัด ตามรหัสหรือเพราะเครื่องคอมพิวเตอร์ของคุณไม่สามารถแสดงผลที่ 60fps มักจะมีปัญหานี้ผมคิดว่า :)
รอย T.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.