มีประวัติศาสตร์อันยาวนานของวิธีที่เรามาถึงการประชุมสามัญนี้ด้วยความท้าทายที่น่าสนใจมากมายระหว่างทางดังนั้นฉันจะพยายามกระตุ้นมันในแต่ละขั้นตอน:
1. ปัญหา: อุปกรณ์ทำงานด้วยความเร็วที่แตกต่างกัน
เคยลองเล่นเกม DOS เก่าบนพีซีที่ทันสมัยและมันเล่นได้เร็วอย่างไม่น่าเชื่อ - แค่พร่ามัวหรือเปล่า?
เกมเก่า ๆ หลายเกมมีลูปการอัปเดตที่ไร้เดียงสา - พวกเขาจะรวบรวมอินพุตอัปเดตสถานะเกมและแสดงผลเร็วที่สุดเท่าที่ฮาร์ดแวร์จะอนุญาตโดยไม่คิดว่าเวลาผ่านไปนานเท่าใด ซึ่งหมายความว่าทันทีที่ฮาร์ดแวร์เปลี่ยนแปลงการเล่นเกมจะเปลี่ยนไป
โดยทั่วไปเราต้องการให้ผู้เล่นของเรามีประสบการณ์และความรู้สึกเกมที่สอดคล้องกับอุปกรณ์หลากหลาย (ตราบเท่าที่พวกเขามีคุณสมบัติขั้นต่ำ) ไม่ว่าพวกเขาจะใช้โทรศัพท์ของปีที่แล้วหรือรุ่นใหม่ล่าสุดเกมบนเดสก์ท็อปหรือ แล็ปท็อประดับกลาง
โดยเฉพาะอย่างยิ่งสำหรับเกมที่มีการแข่งขัน (ไม่ว่าจะเป็นผู้เล่นหลายคนหรือผ่านกระดานผู้นำ) เราไม่ต้องการให้ผู้เล่นทำงานบนอุปกรณ์ใดอุปกรณ์หนึ่งเพื่อให้ได้เปรียบเหนือผู้อื่นเพราะพวกเขาสามารถทำงานได้เร็วขึ้นหรือมีเวลามากขึ้น
โซลูชัน surefire ที่นี่คือเพื่อล็อคอัตราที่เราทำการอัพเดทเกมเพลย์ ด้วยวิธีนี้เราสามารถรับประกันผลลัพธ์ที่ได้จะเหมือนเดิมเสมอ
2. ดังนั้นทำไมไม่เพียงล็อค framerate (เช่นใช้ VSync) และยังคงเรียกใช้การอัปเดตและการแสดงผลสถานะการเล่นเกมใน lockstep?
สิ่งนี้สามารถใช้งานได้ แต่ผู้ชมอาจไม่พอใจเสมอไป มีเวลานานเมื่อทำงานที่ 30 fps ที่แข็งถือเป็นมาตรฐานทองคำสำหรับเกม ตอนนี้ผู้เล่นคาดหวัง 60 เฟรมต่อวินาทีเป็นแถบขั้นต่ำโดยเฉพาะอย่างยิ่งในเกมแอ็คชั่นแบบผู้เล่นหลายคนและตอนนี้ผู้เล่นเก่า ๆ บางคนก็ดูเหมือนจะเปลี่ยนแปลงเร็วตามที่คาดการณ์ไว้ นอกจากนี้ยังมีกลุ่มแกนนำของผู้เล่น PC โดยเฉพาะอย่างยิ่งที่คัดค้านการล็อกเฟรมทั้งหมด พวกเขาจ่ายเงินจำนวนมากสำหรับฮาร์ดแวร์ที่มีเลือดออกและพวกเขาต้องการที่จะใช้กล้ามเนื้อการคำนวณนั้นเพื่อการเรนเดอร์ที่ราบรื่นและมีความเที่ยงตรงสูงสุดที่มันสามารถทำได้
ใน VR โดยเฉพาะ framerate คือราชาและมาตรฐานยังคงคืบคลาน ในช่วงแรกของการฟื้นตัวของ VR เกมมักจะวิ่งประมาณ 60 เฟรมต่อวินาที ตอนนี้ 90 เป็นมาตรฐานมากขึ้นและแฮร์แวร์เช่น PSVR เริ่มสนับสนุน 120 สิ่งนี้อาจเพิ่มขึ้นอย่างต่อเนื่อง ดังนั้นหากเกม VR จำกัด ขอบเขตของสิ่งที่สามารถทำได้และยอมรับได้ในวันนี้ก็มีแนวโน้มที่จะถูกทิ้งไว้ข้างหลังในขณะที่ฮาร์ดแวร์และความคาดหวังพัฒนาต่อไป
(ตามกฎแล้วระวังเมื่อมีการบอกว่า "ผู้เล่นไม่สามารถรับรู้อะไรเร็วกว่า XXX" เพราะโดยปกติแล้วจะขึ้นอยู่กับ "การรับรู้" บางประเภทเช่นการจดจำเฟรมตามลำดับการรับรู้ความต่อเนื่องของการเคลื่อนไหว ละเอียดอ่อน)
ปัญหาสุดท้ายที่นี่คือเกมที่ใช้ framerate ที่ล็อคไว้จะต้องระมัดระวังเช่นกันหากคุณเคยเล่นเกมที่คุณกำลังอัปเดตและแสดงวัตถุจำนวนมากผิดปกติคุณไม่ต้องการพลาดเฟรมของคุณ กำหนดเวลาและทำให้เกิดการพูดติดอ่างหรือผูกปม ดังนั้นคุณต้องกำหนดงบประมาณเนื้อหาของคุณให้ต่ำพอที่จะออกจากห้องว่างหรือลงทุนในคุณสมบัติการปรับคุณภาพแบบไดนามิกที่ซับซ้อนยิ่งขึ้นเพื่อหลีกเลี่ยงการ pegging ประสบการณ์การเล่นทั้งหมดกับประสิทธิภาพที่แย่ที่สุดในฮาร์ดแวร์ min-spec
นี่อาจเป็นปัญหาโดยเฉพาะอย่างยิ่งหากปัญหาด้านประสิทธิภาพปรากฏขึ้นช้าในการพัฒนาเมื่อระบบที่มีอยู่ทั้งหมดของคุณได้รับการสร้างและปรับแต่งโดยสมมติว่าการเรนเดอร์เฟรมล็อคเฟรมเป็นสิ่งที่คุณไม่สามารถทำได้ การแยกการอัปเดตและอัตราการเรนเดอร์มีความยืดหยุ่นมากขึ้นสำหรับการจัดการกับความแปรปรวนของประสิทธิภาพ
3. การอัปเดตตามเวลาที่กำหนดไม่ได้มีปัญหาเหมือนกับ (2) ใช่หรือไม่
ฉันคิดว่านี่เป็นเนื้อของคำถามเดิม: ถ้าเราแยกการอัปเดตของเราออกและบางครั้งทำให้เฟรมสองเฟรมโดยที่ไม่มีการอัพเดตสถานะของเกมในระหว่างนั้นมันไม่เหมือนกับการเรนเดอร์ lockstep ที่อัตราเฟรมต่ำกว่า หน้าจอ?
จริงๆแล้วมีหลายวิธีที่เกมใช้ในการแยกการปรับปรุงเหล่านี้ออกมาให้ได้ผลดี:
a) อัตราการอัปเดตอาจเร็วกว่าอัตราเฟรมที่แสดงผล
ในฐานะที่เป็น tyjkenn บันทึกในคำตอบอื่นฟิสิกส์โดยเฉพาะอย่างยิ่งมักจะก้าวที่ความถี่สูงกว่าการแสดงผลซึ่งจะช่วยลดข้อผิดพลาดการรวมและให้การชนที่แม่นยำยิ่งขึ้น ดังนั้นแทนที่จะมีการอัพเดต 0 หรือ 1 ระหว่างเฟรมที่แสดงผลคุณอาจมี 5 หรือ 10 หรือ 50
ตอนนี้ผู้เล่นเรนเดอร์ที่ 120 fps สามารถรับการอัพเดตได้ 2 เฟรมต่อเฟรมในขณะที่ผู้เล่นที่ใช้ฮาร์ดแวร์ที่ต่ำกว่าที่ 30 เฟรมต่อวินาทีได้รับ 8 อัปเดตต่อเฟรมและเกมของพวกเขาทั้งสองทำงาน ฮาร์ดแวร์ที่ดีกว่าทำให้ดูราบรื่นขึ้น แต่ไม่ได้เปลี่ยนแปลงการเล่นเกมอย่างสิ้นเชิง
มีความเสี่ยงที่นี่หากอัตราการอัปเดตไม่ตรงกับอัตราเฟรมคุณสามารถรับ "ความถี่ความถี่" ระหว่างสองค่านี้ได้ เช่น. เฟรมส่วนใหญ่เรามีเวลาเพียงพอสำหรับการอัปเดตสถานะของเกม 4 รายการและเหลืออีกเล็กน้อยดังนั้นทุกครั้งที่เรามีการบันทึกมากพอที่จะอัปเดต 5 ครั้งในเฟรมทำให้กระโดดหรือพูดติดอ่างเล็กน้อยในการเคลื่อนไหว สามารถแก้ไขได้โดย ...
b) การสอดแทรก (หรือการคาดการณ์) สถานะของเกมระหว่างการอัพเดท
ที่นี่เรามักจะปล่อยให้เกมอยู่ในเวลาหนึ่งคงที่ในอนาคตและเก็บข้อมูลที่เพียงพอจาก 2 สถานะล่าสุดที่เราสามารถกำหนดจุดโดยพลการระหว่างพวกเขาได้ จากนั้นเมื่อเราพร้อมที่จะแสดงเฟรมใหม่บนหน้าจอเราผสมผสานกับช่วงเวลาที่เหมาะสมสำหรับการแสดงเท่านั้น (เช่นเราไม่ได้แก้ไขสถานะการเล่นเกมที่นี่)
เมื่อทำถูกต้องสิ่งนี้ทำให้การเคลื่อนไหวรู้สึกเหมือนเนยลื่นและยังช่วยปกปิดความผันผวนบางอย่างในอัตราเฟรมตราบใดที่เราไม่ลดลงต่ำเกินไป
c) การเพิ่มความราบรื่นให้กับการเปลี่ยนแปลงที่ไม่ใช่เกมเพลย์
แม้ว่าจะไม่มีการแก้ไขปัญหาการเล่นเกมเราก็ยังสามารถได้รับชัยชนะอย่างราบรื่น
การเปลี่ยนแปลงของภาพอย่างแท้จริงเช่นภาพเคลื่อนไหวตัวละครระบบอนุภาคหรือ VFX และองค์ประกอบส่วนต่อประสานผู้ใช้เช่น HUD มักจะอัปเดตแยกต่างหากจากการประทับเวลาคงที่ของการเล่นเกม ซึ่งหมายความว่าหากเราทำเครื่องหมายว่าการเล่นเกมของเราระบุหลายครั้งต่อเฟรมเราจะไม่จ่ายค่าใช้จ่ายสำหรับทุกเห็บ - เฉพาะในการแสดงผลรอบสุดท้าย แต่เราปรับขนาดความเร็วในการเล่นของเอฟเฟกต์เหล่านี้ให้ตรงกับความยาวของเฟรมดังนั้นพวกเขาจึงเล่นได้อย่างราบรื่นตามที่อนุญาตให้แสดงผลแบบเฟรมโดยไม่กระทบกับความเร็วของเกมหรือความเป็นธรรมดังที่กล่าวไว้ใน (1)
การเคลื่อนไหวของกล้องสามารถทำได้เช่นกัน - โดยเฉพาะอย่างยิ่งใน VR บางครั้งเราจะแสดงเฟรมเดียวกันมากกว่าหนึ่งครั้ง แต่ปฏิเสธที่จะคำนึงถึงการเคลื่อนไหวศีรษะของผู้เล่นในระหว่างนั้นดังนั้นเราจึงสามารถปรับปรุงเวลาแฝงและความสบายที่รับรู้ได้ ทำให้ทุกอย่างเร็วขึ้น ระบบการสตรีมเกมบางเกม (ที่เกมกำลังทำงานบนเซิร์ฟเวอร์และผู้เล่นรันเฉพาะไคลเอ็นต์แบบบาง) ใช้เวอร์ชันนี้เช่นกัน
4. ทำไมไม่ใช้สไตล์ (c) สำหรับทุกอย่าง? ถ้ามันใช้งานได้กับอนิเมชั่นและ UI เราไม่สามารถปรับขนาดการอัปเดตสถานะการเล่นเกมของเราให้ตรงกับอัตราเฟรมปัจจุบันได้หรือไม่
ใช่ * เป็นไปได้ แต่ไม่ง่าย
คำตอบนี้มีมานานแล้วดังนั้นฉันจะไม่เข้าไปดูรายละเอียดเต็มไปหมดเพียงแค่บทสรุปอย่างย่อ:
การคูณด้วยdeltaTime
งานเพื่อปรับให้เข้ากับการอัปเดตความยาวผันแปรสำหรับ การเปลี่ยนแปลงเชิงเส้น (เช่นการเคลื่อนไหวด้วยความเร็วคงที่, การนับถอยหลังของตัวจับเวลาหรือความคืบหน้าตามเส้นเวลาภาพเคลื่อนไหว)
แต่น่าเสียดายที่หลาย ๆ ด้านของเกมที่ไม่ใช่เชิงเส้น แม้แต่สิ่งที่เรียบง่ายอย่างแรงโน้มถ่วงก็ยังต้องการเทคนิคการรวมที่ซับซ้อนมากขึ้นหรือขั้นตอนย่อยที่มีความละเอียดสูงกว่าเพื่อหลีกเลี่ยงผลลัพธ์ที่แตกต่างภายใต้เฟรมที่แตกต่างกัน อินพุตและการควบคุมของผู้เล่นเป็นแหล่งใหญ่ของการไม่เป็นเชิงเส้น
โดยเฉพาะอย่างยิ่งผลลัพธ์ของการตรวจจับการชนกันโดยไม่ตั้งใจและความละเอียดขึ้นอยู่กับอัตราการอัปเดตซึ่งนำไปสู่ข้อผิดพลาดในการทันเนลและการสั่นสะเทือนหากเฟรมยาวเกินไป ดังนั้นตัวแปรที่เป็นตัวแปรบังคับให้เราใช้วิธีการตรวจสอบการชนกันอย่างต่อเนื่องที่ซับซ้อนและมีราคาแพงมากขึ้นกับเนื้อหาของเรามากขึ้นหรือยอมรับความแปรปรวนในฟิสิกส์ของเรา แม้กระทั่งการตรวจจับการชนอย่างต่อเนื่องจะพบกับความท้าทายเมื่อวัตถุเคลื่อนที่เข้าโค้งต้องใช้เวลาประทับสั้นลง ...
ดังนั้นในกรณีทั่วไปสำหรับเกมที่มีความซับซ้อนปานกลางการรักษาพฤติกรรมและความเป็นธรรมที่สอดคล้องกันอย่างสมบูรณ์ผ่านการdeltaTime
ปรับสเกลนั้นอยู่ระหว่างความยากลำบากมากและการบำรุงรักษาอย่างเข้มข้นจนถึงความเป็นไปไม่ได้ทันที
การกำหนดอัตราการอัปเดตมาตรฐานให้เรารับประกันพฤติกรรมที่สอดคล้องกันมากขึ้นในทุกช่วงของเงื่อนไขมักใช้รหัสที่ง่ายกว่า
การรักษาอัตราการปรับปรุงที่หลุดพ้นจากการแสดงผลจะช่วยให้เรามีความยืดหยุ่นในการควบคุมความเรียบเนียนและประสิทธิภาพการทำงานของประสบการณ์โดยไม่ต้องเปลี่ยนตรรกะเพลย์
ถึงอย่างนั้นเราก็ไม่เคยได้รับความเป็นอิสระอย่างสมบูรณ์แบบ "สมบูรณ์แบบ"แต่ก็เหมือนกับวิธีการมากมายในเกมมันทำให้เรามีวิธีการควบคุมในการหมุนไปทาง "ดีพอ" สำหรับความต้องการของเกมที่กำหนด นั่นเป็นสาเหตุที่มันถูกสอนโดยทั่วไปว่าเป็นจุดเริ่มต้นที่มีประโยชน์