การอัพเดทเรนเดอร์อิสระในเกมลูปคืออะไร?


74

มีบทความหนังสือและการอภิปรายมากมายในลูปเกม อย่างไรก็ตามฉันมักเจอสิ่งนี้:

while(running)
{
    processInput();
    while(isTimeForUpdate)
    {
        update();
    }
    render();
}

สิ่งที่ทำให้ฉันรำคาญใจเกี่ยวกับวิธีการนี้คือการแสดงผลแบบ "ปรับปรุงอิสระ" เช่นสร้างเฟรมเมื่อไม่มีการเปลี่ยนแปลงเลย ดังนั้นคำถามของฉันคือทำไมวิธีการนี้มักถูกสอน


6
โดยส่วนตัวแล้วฉันพบว่าgameprogrammingpatterns.com/game-loop.htmlคำอธิบายที่เป็นประโยชน์
Niels

12
การเปลี่ยนแปลงในการเรนเดอร์ทั้งหมดไม่ได้มีผลกับสถานะเกม และฉันสงสัยว่าคุณเข้าใจผิดจุดของรหัสนั้น - อนุญาตให้คุณอัปเดตหลายครั้งต่อการแสดงผลไม่แสดงหลายครั้งต่อการอัปเดต
Luaan

13
ไม่ทราบว่ารหัสอ่านไม่ได้while (isTimeForUpdate) if (isTimeForUpdate)เป้าหมายหลักคือไม่render()เมื่อมียังไม่ได้รับการupdate()แต่update()ซ้ำ ๆ ในระหว่างrender()s ทั้งสองสถานการณ์นั้นมีการใช้งานที่ถูกต้อง อดีตจะใช้ได้หากรัฐสามารถเปลี่ยนแปลงได้นอกupdateฟังก์ชั่นของคุณเช่นเปลี่ยนสิ่งที่แสดงผลตามสถานะโดยนัยเช่นเวลาปัจจุบัน อันหลังนั้นถูกต้องเพราะมันให้ความเป็นไปได้ที่เครื่องยนต์ฟิสิกส์ของคุณจะทำการอัพเดทขนาดเล็กและแม่นยำจำนวนมากเช่นลดโอกาสในการ 'แปรปรวน' ผ่านสิ่งกีดขวาง
ธีรี่ร์

คำถามที่มีเหตุผลมากขึ้นจะเป็น "จุดของการวนรอบการเรนเดอร์เกมขึ้นอยู่กับการอัพเดท" คืออะไร
user1306322

1
คุณมีการอัปเดตที่ไม่ได้ทำอะไรบ่อยแค่ไหน? ไม่แม้แต่จะอัพเดตภาพเคลื่อนไหวพื้นหลังหรือนาฬิกาบนหน้าจอใช่ไหม
pjc50

คำตอบ:


113

มีประวัติศาสตร์อันยาวนานของวิธีที่เรามาถึงการประชุมสามัญนี้ด้วยความท้าทายที่น่าสนใจมากมายระหว่างทางดังนั้นฉันจะพยายามกระตุ้นมันในแต่ละขั้นตอน:

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ปรับสเกลนั้นอยู่ระหว่างความยากลำบากมากและการบำรุงรักษาอย่างเข้มข้นจนถึงความเป็นไปไม่ได้ทันที

การกำหนดอัตราการอัปเดตมาตรฐานให้เรารับประกันพฤติกรรมที่สอดคล้องกันมากขึ้นในทุกช่วงของเงื่อนไขมักใช้รหัสที่ง่ายกว่า

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

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


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

3
แม้ว่าจะเป็นความจริงที่ท่อส่งอัปเดตที่ซับซ้อนมากขึ้นทำให้ง่ายต่อการแนะนำเวลาในการตอบสนองโดยไม่ได้ตั้งใจ แต่ก็ไม่ได้เป็นผลสืบเนื่องมาจากแนวทางที่แยกกันเมื่อดำเนินการอย่างถูกต้อง ในความเป็นจริงเราอาจสามารถลดเวลาแฝง มาเล่นเกมที่มีความเร็ว 60 fps ด้วยการread-update-renderล็อกขั้นตอนเวลาในการตอบสนองกรณีที่เลวร้ายที่สุดของเราคือ 17 มิลลิวินาที (โดยไม่คำนึงถึงขั้นตอนการแสดงผลกราฟิกและเวลาแฝงการแสดงผลตอนนี้) ด้วยการ(read-update)x(n>1)-renderวนซ้ำdecoupled ที่ framerate เดียวกันกรณีเวลาแฝงที่เลวร้ายที่สุดของเราสามารถเหมือนกันหรือดีกว่าเพราะเราตรวจสอบและดำเนินการกับอินพุตบ่อยครั้งหรือมากกว่า :)
DMGregory

3
ข้อความที่น่าสนใจเกี่ยวกับเกมเก่า ๆ ที่ไม่เกี่ยวกับเวลาจริงเกมอาเขต Space Invaders ดั้งเดิมมีข้อผิดพลาดที่เกิดจากการเรนเดอร์พลังงานเมื่อผู้เล่นทำลายเรือข้าศึกการกระทำและการอัพเดทเกม ในเส้นโค้งความยากลำบากที่เป็นสัญลักษณ์ของเกม
Oskuro

1
@DMGregory: ถ้าสิ่งต่าง ๆ ทำแบบอะซิงโครนัสก็จะเป็นไปได้ที่การเปลี่ยนแปลงการควบคุมจะเกิดขึ้นหลังจากวนรอบเกมสำรวจการควบคุมรอบเหตุการณ์เกมหลังจากที่ปัจจุบันเสร็จสิ้นหลังจากวนรอบการแสดงผลคว้าสถานะเกมและ สำหรับลูปการเรนเดอร์หลังจากที่ปัจจุบันเสร็จสิ้นหลังจากระบบเอาท์พุทวิดีโอคว้าบัฟเฟอร์เฟรมปัจจุบันดังนั้นเวลากรณีที่เลวร้ายที่สุดกลายเป็นเพียงอายของเกมวนครั้งสองครั้งบวกสองครั้งเรนเดอร์สองครั้ง การซิงโครไนซ์สิ่งต่าง ๆ อย่างถูกต้องอาจลดลงครึ่งหนึ่ง
supercat

1
@Oskuro: นั่นไม่ใช่ความผิดพลาด ความเร็วของการวนรอบการอัปเดตจะคงที่ไม่ว่าผู้บุกรุกจะอยู่ที่หน้าจอจำนวนเท่าใด แต่เกมไม่ได้ดึงดูดผู้บุกรุกทุกคนในการอัพเดททุกครั้ง
supercat

8

คำตอบอื่น ๆ นั้นดีและพูดคุยเกี่ยวกับสาเหตุของการวนซ้ำของเกมที่มีอยู่และควรแยกจากลูปการเรนเดอร์ อย่างไรก็ตามสำหรับตัวอย่างเฉพาะของ "เหตุใดจึงสร้างเฟรมเมื่อไม่มีการเปลี่ยนแปลง" มันเพิ่งมาลงกับฮาร์ดแวร์และความซับซ้อน

การ์ดแสดงผลเป็นเครื่องจักรของรัฐและพวกเขาทำได้ดีมากในการทำสิ่งเดียวกันซ้ำแล้วซ้ำอีก หากคุณแสดงเฉพาะสิ่งที่มีการเปลี่ยนแปลงจริง ๆ แล้วมันมีราคาแพงกว่าไม่น้อยกว่า ในสถานการณ์ส่วนใหญ่ไม่มีอะไรที่คงที่ถ้าคุณเลื่อนไปทางซ้ายเล็กน้อยในเกม FPS คุณเปลี่ยนข้อมูลพิกเซลเป็น 98% ของสิ่งต่าง ๆ บนหน้าจอคุณอาจแสดงผลทั้งเฟรม

แต่ความซับซ้อนเป็นหลัก การติดตามทุกสิ่งที่มีการเปลี่ยนแปลงในขณะที่ทำการอัปเดตนั้นแพงกว่ามากเพราะคุณต้องทำใหม่ทุกอย่างหรือติดตามผลลัพธ์เก่าของอัลกอริทึมเปรียบเทียบกับผลใหม่และแสดงพิกเซลนั้นหากการเปลี่ยนแปลงนั้นแตกต่างกัน มันขึ้นอยู่กับระบบ

การออกแบบฮาร์ดแวร์และอื่น ๆ นั้นได้รับการปรับให้เหมาะสมที่สุดสำหรับการประชุมปัจจุบันและเครื่องของรัฐก็เป็นแบบอย่างที่ดีสำหรับการเริ่มต้น


5
มีความแตกต่างระหว่างการเรนเดอร์ (ทุกอย่าง) เฉพาะเมื่อมีการเปลี่ยนแปลง (คำถามที่ถาม) และการแสดงเฉพาะส่วนที่มีการเปลี่ยนแปลง (คำตอบของคุณอธิบาย)
DMGregory

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

นอกจากนี้ฉันทราบว่าไม่มีเหตุผลที่จะไม่แสดงผล คุณรู้ว่าคุณเคยมีเวลาสำหรับการโทรทำให้คุณทุกเฟรม (คุณจะดีกว่ารู้ว่าคุณเคยมีเวลาสำหรับการโทรทำให้คุณทุกกรอบ!) เพื่อให้มีอันตรายน้อยมากในการทำ 'ไม่จำเป็น' แสดงผล - โดยเฉพาะอย่างยิ่งนับตั้งแต่กรณีนี้จะ เป็นหลักไม่เคยเกิดขึ้นในทางปฏิบัติ
Steven Stadnicki

@StevenStadnicki มันเป็นความจริงว่ามีไม่ได้เป็นใหญ่เวลาค่าใช้จ่ายในการแสดงผลทุกอย่างทุกเฟรม (ตั้งแต่คุณจะต้องมีเวลาในงบประมาณของคุณจะทำอย่างนั้นอยู่แล้วเมื่อใดก็ตามที่มีจำนวนมากของการเปลี่ยนแปลงของรัฐในครั้งเดียว) แต่สำหรับอุปกรณ์พกพาเช่นแล็ปท็อปแท็บเล็ตโทรศัพท์หรือระบบเกมพกพาอาจต้องคำนึงถึงเพื่อหลีกเลี่ยงการเรนเดอร์ซ้ำซ้อนเพื่อให้ใช้งานแบตเตอรี่ได้อย่างมีประสิทธิภาพ สิ่งนี้ใช้กับเกมที่มี UI หนักเป็นส่วนใหญ่ซึ่งหน้าจอขนาดใหญ่อาจยังคงไม่เปลี่ยนแปลงสำหรับเฟรมระหว่างการกระทำของผู้เล่นและจะไม่สามารถนำไปปฏิบัติได้จริงขึ้นอยู่กับสถาปัตยกรรมของเกม
DMGregory

6

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

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


1
หรือตัวอย่างเช่นวัดเวลาระหว่างเห็บและคำนวณว่าตัวละครควรไปไกลแค่ไหนในเวลานั้น? วันที่ภาพเคลื่อนไหวผีสางคงที่ผ่านมานานแล้ว!
เกรแฮม

2
มนุษย์ไม่สามารถรับรู้สิ่งต่าง ๆ ได้เร็วกว่า 60fps โดยไม่ต้องใช้นามแฝงชั่วคราว แต่อัตราเฟรมที่จำเป็นเพื่อให้เกิดการเคลื่อนไหวที่ราบรื่นในกรณีที่ไม่มีการเคลื่อนไหวเบลออาจสูงกว่านั้นมาก นอกเหนือจากความเร็วที่กำหนดแล้วล้อหมุนควรปรากฏเป็นภาพเบลอ แต่หากซอฟต์แวร์ไม่ใช้การเคลื่อนไหวเบลอและล้อหมุนมากกว่าครึ่งก้านต่อเฟรมล้ออาจดูไม่ดีแม้ว่าอัตราเฟรมจะอยู่ที่ 1000 เฟรมต่อวินาที
supercat

1
@ Graham แล้วคุณพบปัญหาจากย่อหน้าแรกของฉันที่สิ่งต่าง ๆ เช่นฟิสิกส์ซุกซนกับการเปลี่ยนแปลงที่ใหญ่กว่าต่อเห็บ หากอัตราเฟรมลดลงต่ำพอการชดเชยกับการเปลี่ยนแปลงครั้งใหญ่อาจทำให้ผู้เล่นวิ่งไปทางกำแพงโดยไม่มีกล่องกระทบ
tyjkenn

1
โดยปกติมนุษย์ไม่สามารถรับรู้ได้เร็วกว่า 60 fps ดังนั้นจึงไม่มีประโยชน์ที่จะเปลืองทรัพยากรในการเรนเดอร์เร็วกว่านั้น ฉันมีปัญหากับคำสั่งนั้น VR HMD แสดงผลที่ 90Hz และกำลังเพิ่มขึ้น เชื่อฉันเมื่อฉันบอกคุณว่าคุณสามารถรับรู้ความแตกต่างระหว่าง 90Hz และ 60Hz บนชุดหูฟัง นอกจากนี้ฉันเคยเห็นเกมจำนวนมากที่เร็ว ๆ นี้ที่มี CPU-bound เป็น GPU-bound การบอกว่า "การเรนเดอร์มักเป็นกระบวนการที่ช้าที่สุด" ไม่จำเป็นต้องเป็นเรื่องจริง
3Dave

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

4

การสร้างอย่างหนึ่งในคำถามของคุณสามารถทำให้รู้สึกว่าระบบย่อยการแสดงผลที่มีความคิดบางส่วนของ"เวลาผ่านไปนับตั้งแต่ที่ผ่านมาทำให้"

ตัวอย่างเช่นพิจารณาวิธีการที่ตำแหน่งของวัตถุในโลกของเกมถูกแสดงผ่าน(x,y,z)พิกัดคงที่ด้วยวิธีการที่เก็บเวกเตอร์การเคลื่อนไหวปัจจุบัน(dx,dy,dz)เพิ่มเติม ตอนนี้คุณสามารถเขียนห่วงเกมของคุณเพื่อให้การเปลี่ยนแปลงของตำแหน่งที่มีการเกิดขึ้นในupdateวิธี แต่คุณยังสามารถออกแบบเพื่อให้การเปลี่ยนแปลงของการเคลื่อนไหวupdateที่มีการเกิดขึ้นในช่วง ด้วยวิธีการหลังแม้ว่ารัฐเกมของคุณจริงจะไม่เปลี่ยนจนกว่าจะมีการต่อไปupdateเป็นrenderฟังก์ชั่นที่เรียกว่าที่ความถี่สูงกว่าสามารถวาดวัตถุที่ตำแหน่งที่อัปเดตแล้วเล็กน้อย ในขณะที่เทคนิคนี้นำไปสู่ความแตกต่างระหว่างสิ่งที่คุณเห็นและสิ่งที่เป็นตัวแทนภายในความแตกต่างมีขนาดเล็กพอที่จะไม่สำคัญสำหรับแง่มุมในทางปฏิบัติส่วนใหญ่

การคาดการณ์ "อนาคต" ของสถานะเกมของคุณ (แม้จะเสี่ยงต่อการถูกผิด) อาจเป็นความคิดที่ดีเมื่อคุณใช้เวลาในการตอบสนองความล่าช้าของเครือข่ายอินพุท


4

นอกจากคำตอบอื่น ๆ ...

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

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

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