พ้นขอบเขตในเกม AAA


21

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

มันสามารถอธิบายได้ว่าคล้ายกับร่องรอยของหน้าต่างที่ Windows XP อาจทิ้งไว้ข้างหลังหน้าต่างที่ถูกลากขณะที่มีระบบหยุดทำงาน

ฉันสามารถยืนยันได้ว่าผู้พัฒนาไม่ได้ล้างบัฟเฟอร์สีเมื่อรีเฟรชหน้าจอหรือไม่

ถูกต้องไหม ถ้าเป็นเช่นนั้นทำไม


8
BTW ซึ่งมักเรียกว่าเอฟเฟกต์ "Hall of Mirrors" หรือ HOM
นาธานรีด

คำตอบ:


35

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

ด้วยเหตุนี้ผู้พัฒนาเกมพบว่ามันจะมีประสิทธิภาพมากกว่าเพียงแค่สมมติว่าทุกพิกเซลจะแสดงผลอีกครั้ง พวกเขาพัฒนาเทคนิคมากมายสำหรับการทำเช่นนี้

บัฟเฟอร์สีเป็นวิธีที่ง่ายที่สุดในการเพิกเฉย ง่ายน้อยคือบัฟเฟอร์ความลึกเพราะมันจะถูกปนเปื้อนด้วยข้อมูลเก่า ดังนั้นสิ่งที่พวกเขาทำก็เรียบง่าย

ในเฟรม 0 พวกเขาจะแสดงด้วยglDepthRange(หรือเทียบเท่า D3D) ของ (0, 0.5) และพวกเขาจะใช้หนึ่งglDepthFuncของGL_LESS(หรือGL_LEQUAL) ซึ่งหมายความว่าค่าความลึกที่ไกลที่สุดที่คุณเคยได้รับในบัฟเฟอร์ความลึกคือ 0.5 ดังนั้นค่าที่ใหญ่ที่สุดในบัฟเฟอร์ความลึกที่ส่วนท้ายของเฟรม 0 คือ 0.5 (สมมติว่าคุณเขียนทุกพิกเซล)

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

แล้วพวกเขาก็ทำซ้ำ

สำหรับฮาร์ดแวร์ใด ๆ ที่ทำมาตั้งแต่ประมาณปี 2003 นี่ไม่ใช่การเพิ่มประสิทธิภาพอีกต่อไป แท้จริงมันคือการเพิ่มประสิทธิภาพเชิงลบ ล้างลึกบัฟเฟอร์จริงทำให้ฮาร์ดแวร์ได้เร็วขึ้น ไม่มีจริงๆ.

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

ดังนั้นทุกครั้งแรกอ่าน / แก้ไข / เขียนที่คุณทำในแต่ละบรรทัดแคชหลังจากที่ชัดเจนก็คือการเขียน มันเป็นฟรี

นอกจากนี้การมีบัฟเฟอร์ความลึกแบบขรุขระสามารถทำงานกับ Hyper-Z / Hierarchial-Z / การปรับแต่ง Z-culling ใด ๆ ในฮาร์ดแวร์ ใช่ฉากของคุณจะทำงานกับฉากเหล่านั้นในที่สุดเมื่อคุณเพิ่มรายละเอียด แต่ถ้าบัฟเฟอร์ความลึกของคุณขรุขระจากการเรนเดอร์ก่อนหน้าแม้ว่าวัตถุพื้นหลังเหล่านั้นจะอยู่ในพื้นหลังก็อาจส่งผลกระทบต่อประสิทธิภาพของเทคนิค Z-culling และนั่นจะไม่ช่วยในเรื่องประสิทธิภาพ

ดังนั้นคุณไม่ควรทำเทคนิคการย้อนกลับความลึกนี้ในเกมสมัยใหม่

หมายเหตุ: Jari สร้างจุดที่ดีในสถาปัตยกรรมการแสดงผลแบบเรียงต่อกัน (ตามที่พบในแพลตฟอร์มมือถือส่วนใหญ่) การไม่ล้างความลึกอาจทำให้สิ่งที่ไม่พึงประสงค์ในที่นั่นเกินไป


คำแถลงสุดท้ายของคุณหมายถึงการไม่สลับบัฟเฟอร์ความลึกหรือไม่? คำตอบที่ดี
decaviatedcaviar

1
@Daniel ใช่ ฉันชี้แจงโพสต์ของฉัน
Nicol Bolas

3
นอกจากนี้การกระโดดข้ามที่ชัดเจนเกี่ยวกับ binning สถาปัตยกรรม (ชอบมากที่สุดชิป OpenGL ES) สาเหตุใหญ่สูญเสียประสิทธิภาพการทำงานเป็นชิปกราฟิกที่ไม่สามารถทำให้สมมติฐานในรัฐกันชนสี
Jari Komppa

5

ใช่คุณคิดถูกว่าบัฟเฟอร์ด้านหลังไม่ได้ถูกลบทิ้ง

เหตุใดเพราะ (ส่วนใหญ่) ที่เร็วกว่าการใช้ shader แบบกำหนดเองที่ค่าความลึก ping-pongs ในทิศทางตรงกันข้ามแต่ละเฟรมและพึ่งพาความจริงที่ว่าเกมของคุณแสดงผลทุกพิกเซลบนหน้าจอ

ดังนั้นสำหรับค่าใช้จ่ายศูนย์คุณประหยัดหนึ่งบัฟเฟอร์ที่ชัดเจนต่อเฟรม


1
ฉันไม่รู้เกี่ยวกับ ping-ping ทุกเครื่องยนต์ที่ฉันคุ้นเคยกับการลบบัฟเฟอร์ความลึก / ลายฉลุในแต่ละเฟรม แต่นอกเหนือจากนั้นถ้าเกมให้พิกเซลทั้งหมด (เท่าที่ควร) คุณไม่จำเป็นต้องล้างบัฟเฟอร์สี
นาธานรีด

คุณช่วยยกตัวอย่างให้กับ shader ได้หรือไม่คำตอบที่ดี
deceleratedcaviar

1
ฉันรู้ว่าคุณกำลังถามเกี่ยวกับเอ็นจิ้นล่าสุดการอ่านความคิดเห็นของ @ NathanReed คือเอ็นจิ้นเฉพาะพีซีเท่านั้นทำงานในขณะนี้ Z buffer Twist เป็นเทคนิคที่เก่ากว่าฉันจะดูว่าฉันสามารถหาข้อมูลอ้างอิงได้หรือไม่ เอ็นจิ้นคอนโซลจะล้างบัฟเฟอร์สีทั้งหมดด้วยเช่นกันแม้กระทั่งหนึ่งพิกเซลที่แสดงเอฟเฟ็กต์ HOM ชื่อ Nathan จะล้มเหลวในชื่อและบังคับให้ผ่านการส่งอีกครั้ง
Patrick Hughes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.