UPS และ FPS - ฉันควร จำกัด อะไรและทำไม


11

ขณะนี้ฉันกำลังเขียนเกมโดยใช้ C ++ และ SDL2 และมีสิ่งหนึ่งที่ฉันสงสัย - มีเหตุผลไหมที่จะ จำกัด จำนวนเฟรมต่อวินาที (FPS) และ / หรืออัปเดตต่อวินาที (UPS)

ฉันเข้าใจว่าถ้าคุณ จำกัด ยูพีเอสคุณจะต้องควบคุมความเร็วของเกมเป็นหลัก - หากผู้เล่นเคลื่อนที่ 1px ต่อการอัปเดตและคุณอัพเดท 30 ครั้งต่อวินาทีเขาจะเคลื่อนที่ด้วยความเร็ว 30px / s และคุณ อาจช่วยลด CPU ได้เนื่องจากจำนวนการคำนวณต่อวินาทีจะลดลง หากคุณ จำกัด FPS จำนวนการเรียกเลขหมายต่อวินาทีจะลดลงดังนั้นคุณจึงลดการใช้ GPU ของคุณ ฉันหวังว่าฉันจะเข้าใจทุกอย่างถูกต้องถ้าไม่รู้สึกอิสระที่จะแก้ไขให้ถูกต้อง

คำถามของฉันคือ - ฉันควร จำกัด อะไรในเกมของฉัน FPS? ยูพีเอส? ทั้งสอง? ทั้ง? มีอีกวิธีที่ดีกว่านี้? เกมนี้ส่วนใหญ่ทำได้อย่างไรและทำไม?

คำตอบนั้นได้รับการชื่นชมอย่างมาก!


2
ไม่ใช่คำตอบจริงๆ แต่คุณอาจพบว่ามีประโยชน์: gafferongames.com/game-physics/fix-your-timestep
Cypher

คำตอบ:


10

ใช่มันสมเหตุสมผลแล้ว

อย่างที่คุณบอกว่ามันจะทำให้โหลดน้อยลงในระบบซึ่งเป็นผลดีต่อความร้อนและการใช้งานอื่น ๆ

อย่างไรก็ตาม .... ตรรกะเกมของคุณไม่ควรขึ้นอยู่กับการอัพเดทต่อวินาที ดังนั้นฉันขอแนะนำให้คุณดูความล่าช้าซึ่งจะทำให้เกมของคุณไม่ขึ้นกับการอัพเดทต่อวินาที

ฉันแนะนำให้คุณดูคำถามนี้ มันอธิบายวิธีการคำนวณและใช้งานได้ค่อนข้างดี วิธีรับและใช้เวลาเดลต้า

หวังว่ามันจะช่วย!


ดังนั้นฉันควร จำกัด ทั้งสองหรือเพียงหนึ่งในนั้น?
DocCoock

ทั้งสอง แต่เพิ่มตัวเลือกในการตั้งค่าเพื่อปรับ
KaareZ

5
คำเตือน: ถ้าคุณใช้เครื่องยนต์ฟิสิกส์ให้ทำไม่ได้พึ่งพากรอบเวลาการปรับปรุงเดลต้า / ตัวแปรเหล่านี้ได้รับการสนับสนุนไม่ค่อย; พวกเขาต้องการวิธีเฟรมคงที่ และหากเฟรมของคุณผันผวนมากอาจหมายความว่าคุณมีปัญหากับซอฟต์แวร์และสงสัยว่าทำไมจึงเกิดขึ้น ให้เหล่านี้คุณอาจพิจารณาใช้วิธีการ DT
Vaillancourt

1
หมายเหตุว่าการใช้การปรับปรุงตามเวลาเดลต้าสามารถนำไปสู่ความไม่แน่นอนทางฟิสิกส์และข้อบกพร่องที่มีมากยากที่จะทำซ้ำ ในบางเกมมีเทคนิคที่เป็นไปได้ในอัตราเฟรมที่แน่นอนเท่านั้น นี่คือเหตุผลที่ฟิสิกส์มักจะทำงานที่อัตราเฟรมคงที่ คุณสามารถแก้ไขด้วยอัตราการอัปเดตที่ต่ำกว่าได้เสมอ แต่หากการจำลองของคุณไม่เสถียรจะไม่มีสิ่งใดช่วยคุณได้
Dietrich Epp

1
สุจริตฉันคิดว่า deltatime ไม่ใช่ความคิดที่ดี ฉันใช้มันมาหลายปีแล้วและมันมีประเด็นสำคัญสองประการ บทความที่มีผู้เล่นหลายคนที่แตกต่างกันจำนวนมากแนะนำให้ใช้ขั้นตอนเวลาที่แน่นอนสำหรับและหากช่วงเวลาดังกล่าวสูงเกินไปคุณสามารถส่งผ่านทางกำแพงหรือข้อบกพร่องที่คล้ายกันได้เว้นแต่ว่าคุณจะคำนึงถึงเรื่องนั้น
Programmdude

6

คำตอบที่ดีที่สุดคือ: มันขึ้นอยู่กับ

คุณไม่จำเป็นต้อง จำกัด ใครเลย

อัปเดต : หากการอัปเดตของคุณไม่ได้ถูก จำกัด ไว้ที่ระดับสูงสุดตรรกะของเกมควรขึ้นอยู่กับจำนวนเวลาของเดลต้าเพื่อหลีกเลี่ยงการรันเกมเร็วขึ้นหรือช้าลงทั้งนี้ขึ้นอยู่กับเครื่องที่ใช้งานอยู่ นี่เป็นวิธีการทั่วไปที่ใช้โดยหลาย ๆ เกม แต่มันไม่ได้เป็นเกมเดียว

การแสดงผล : หากการแสดงผลจะไม่ผูกพันกับขีด จำกัด บน, framebuffer อาจจะนำเสนอในรัฐที่ไม่สมบูรณ์หรือมีข้อผิดพลาดที่ก่อให้เกิดสิ่งประดิษฐ์ที่ฉีกขาด นี่คือเหตุผลที่หลาย ๆ เกมใช้การซิงโครไนซ์แนวตั้ง (v-sync)

คุณอาจ จำกัด ทั้งสอง

อัปเดต : บางเกมใช้ประโยชน์จากการประทับเวลาคงที่สำหรับระบบการเล่นเกมบางส่วนหรือทั้งหมด วิธีการนี้ใช้งานได้ตามที่คุณอธิบาย จำนวนการอัปเดตต่อวินาทีถูก จำกัด ไว้ที่ขอบเขตสูงสุดเพื่อให้แน่ใจว่าสิ่งต่าง ๆ จะไม่เคลื่อนไหวเร็วเกินไปบนเครื่องที่มีรอยบากด้านบน สิ่งนี้ทำให้ไม่จำเป็นต้องใช้เวลาของเดลต้า บางแอปพลิเคชันดีกว่าด้วยการกำหนดเวลาตายตัวบางแอปพลิเคชันที่มีการกำหนดเวลาเดลต้า การเลือกวิธีการใดจะขึ้นอยู่กับสิ่งที่คุณพยายามจะทำให้สำเร็จ GameProgrammingPatternsหนังสือออนไลน์มีบทที่อุทิศให้กับลูปเกมที่สัมผัสกับสถาปัตยกรรมทั้งสอง

การเรนเดอร์ : เฟรมต่อวินาทีควรถูกตั้งค่าเป็นขีด จำกัด สูงสุดเพื่อหลีกเลี่ยงปัญหาการฉีกขาดที่กล่าวถึงข้างต้นอย่างไรก็ตามแอปพลิเคชันของคุณไม่ควรพยายามทำด้วยตนเองด้วยการล็อก CPU บางตัว ให้เปิดใช้งาน v-sync แทนและปล่อยให้ฮาร์ดแวร์ที่อยู่ด้านล่างซิงโครไนซ์กับอัตราการรีเฟรชของจอภาพ โดยการทำเช่นนั้นเกมของคุณจะเข้ากันได้กับจอภาพในอนาคตซึ่งอาจทำงานด้วยความถี่ที่สูงขึ้นมากจากนั้นก็เป็นธรรมดา 60Hz นอกจากนี้ยังเป็นที่น่าสังเกตว่าผู้เล่นเกมจำนวนมากโดยเฉพาะอย่างยิ่งผู้ที่ต้องการเปรียบเทียบยังคงต้องการที่จะทำงานโดยไม่ต้องใช้ v-sync เพื่อให้ได้อัตราเฟรมสูงสุด ดังนั้นจึงมีเหตุผลที่จะอนุญาตให้เปิดใช้งานหรือปิดใช้งานคุณลักษณะนี้ในระหว่างการใช้งานจริง

สิ่งที่คุณไม่ควร จำกัด

หากเกมของคุณใช้วิธีการโพลตามการป้อนข้อมูลผู้ใช้เช่น: เรียกการgetInput()เรียงลำดับเพื่ออัปเดตสถานะตัวควบคุมในระหว่างขั้นตอนการอัปเดตนี่จะดีกว่าหากไม่ จำกัด หรือถ้า จำกัด ให้ตั้งค่าเป็นขอบเขตบนที่สูงมาก ยิ่งคุณสอบถามผู้ใช้มากขึ้นและดำเนินการกับมันยิ่งเกมตอบสนองและราบรื่นมากขึ้นก็จะ "รู้สึก" เกมที่เรียกว่า 60Hz ที่เราได้ยินในปัจจุบันไม่ได้อัพเดท AI และทุกสถานะโลกในอัตราดังกล่าวบางเกมไม่แสดงผลที่รวดเร็ว แต่พวกมันทำการค้นหาอินพุตคอนโทรลเลอร์อย่างน้อย 60 ครั้งต่อวินาทีและอัปเดตอวาตาร์ของเครื่องเล่นตามนั้น ได้รับการยอมรับว่ามีความเกี่ยวข้องกับเกมแอคชั่นที่รวดเร็ว


แม้ว่าการอัปเดตของฉันจะถูก จำกัด โดยอัตโนมัติเช่นกันเมื่อเปิดใช้งาน VSync ดังนั้นฉันเห็นได้ชัดว่าต้องตัดสินใจระหว่างปัญหาการฉีกขาดและปัญหาการอัพเดทปัญหาถูกต้อง?
DocCoock

@DocCoock หากตัวแสดงผลและลอจิกของเกมทำงานในเธรดเดียวกันใช่การเปิดใช้งาน v-sync ยังช่วยแก้ไขความถี่ในการอัปเดต นั่นเป็นเหตุผลหนึ่งที่บางเกมแยกเรนเดอร์และเกมลอจิกให้กับเธรดที่แตกต่างกัน
glampert

1

มีสองโพสต์ที่คุณอาจต้องการดู:

แก้ไขการประทับเวลาของคุณ

การเรนเดอร์ฟิสิกส์แบบสอดแทรก

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

หวังว่ามันจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.