ฉันรู้เกี่ยวกับต้นไม้ BSP, Octrees และ Portal ที่ใช้มาเป็นเวลานาน แต่เกมสมัยใหม่ยังคงใช้ระบบนี้หรือพวกเขากำลังใช้สิ่งใหม่
หากเป็นไปได้ด้วยข้อดีข้อเสียให้พิจารณาการเรนเดอร์และการตรวจจับการชนกัน
ฉันรู้เกี่ยวกับต้นไม้ BSP, Octrees และ Portal ที่ใช้มาเป็นเวลานาน แต่เกมสมัยใหม่ยังคงใช้ระบบนี้หรือพวกเขากำลังใช้สิ่งใหม่
หากเป็นไปได้ด้วยข้อดีข้อเสียให้พิจารณาการเรนเดอร์และการตรวจจับการชนกัน
คำตอบ:
ใช่อินสแตนซ์ของ Unreal engine 3 ยังคงใช้ BSP - ส่วนใหญ่เป็นเพราะมันถูกใช้ในระหว่างกระบวนการ CSG Doom3 / id tech 4 ใช้พอร์ทัลและฉันคิดว่าฉันได้อ่านบางสิ่งบางอย่างที่ id Tech 5 กลับไปที่ต้นไม้ BSP มีบางเกมที่ใช้ octrees ด้วย ในเกมความเข้าใจของฉันคือ UE3 ย้ายไปที่วิธีการแบบไดนามิกที่มีการสืบค้นบดเคี้ยว แต่ฉันจะแปลกใจถ้าพวกเขาไม่ได้ใช้ BSP อย่างน้อยก็กำหนดว่าตาข่ายแบบคงที่อยู่ในสายตา เกมอื่น ๆ อาจใช้การคัดแบบดู - frustum (เช่นอารยธรรม) มันขึ้นอยู่กับประเภทของเกมที่คุณมอง
เหตุผลที่ BSP และสิ่งของยังคงอยู่เพราะคุณทำอะไรไม่ได้ดีกว่านี้มาก ถ้าคุณมีรูปทรงเรขาคณิตแบบคงที่ BSP นั้นยอดเยี่ยมถ้าคุณสร้างมันขึ้นมาอย่างถูกต้อง มันต้องการให้คุณเขียนตัวสร้าง BSP ซึ่งเป็นเรื่องยาก (แต่มันอาจเกิดขึ้นได้ฟรีหากโซลูชัน CSG ของคุณใช้เพียงหนึ่งเดียว) แปดเดือนและโซลูชั่นแบบไดนามิกมากขึ้น (เช่นการใช้แบบสอบถามแบบบดเคี้ยวสำหรับทุกสิ่ง) นั้นง่ายกว่า ค่าใช้จ่าย แต่ไม่ต้องการการประมวลผลล่วงหน้า (แพง) ของระดับ นั่นเป็นการแลกเปลี่ยนที่บางเกมยินดีที่จะทำ (Crytek ต้องการให้ทุกอย่างทำงานแบบเรียลไทม์ดังนั้นพวกเขาจึงไม่ใช้เวลาในการประมวลผลเพื่อสร้างโครงสร้างการเร่งความเร็วแบบคงที่) วิธีการรันไทม์อื่น ๆ สำหรับซอฟต์แวร์ rasterization CPU และการสืบค้นเคียวรีที่ดำเนินการกับ CPU (ใช้โดยเครื่องมือ Frostbite)
สำหรับวิธีการที่ทันสมัยจริงๆให้ดูที่Umbraซึ่งเป็นมิดเดิลแวร์สำหรับเคียวรีการมองเห็น หากคุณค้นหาเว็บสักเล็กน้อยคุณควรพบบางส่วนของวิทยานิพนธ์หลักที่อธิบายถึงจุดเริ่มต้นของ Umbra
บรรทัดล่าง: ไม่ว่าคุณต้องการใช้ BSP / Octree / no AS จะขึ้นอยู่กับประเภทของเกมที่คุณต้องการสร้าง หากระดับของคุณเป็นแบบคงที่ส่วนใหญ่คุณควรใช้ประโยชน์จากสิ่งนั้นและสร้างโครงสร้างการเร่งความเร็วแบบคงที่ หากทุกอย่างเป็นแบบไดนามิกคุณต้องมีแนวทางอื่นแน่นอน
สำหรับการตรวจจับการชนฉันจะดูที่ Bullet และ PhysX และอัลกอริทึมการตรวจจับการชนกันของมัน แต่ความรู้สึกของฉันคือการแก้ปัญหาทางฟิสิกส์นั้นเชื่อมโยงกับการมองเห็นน้อยกว่าที่เคยเป็นมา - การแก้ปัญหาทางฟิสิกส์อาจต้องการใช้ BVH ที่ใช้ GPU ในกรณีนี้มันไม่มีความรู้สึกอะไรมากนักที่จะลองใช้มันเพื่อค้นหาการมองเห็น
ฉันไม่ทราบว่าเครื่องยนต์ยุคต่อไปกำลังใช้อะไรในวันนี้ แต่ฉันจะบอกคุณว่าฉันรู้อะไร ง่ายต่อการสับสนระหว่างการปรับให้เหมาะสมและโครงสร้างข้อมูลที่ใช้เพื่อช่วยในการปรับให้เหมาะสมนั้น ทุกสิ่งที่กล่าวถึงด้านล่างใช้สำหรับการปรับให้เหมาะสม แต่ฉันจะชี้ให้เห็นว่าอันไหนคือโครงสร้างข้อมูลโดยเฉพาะ
BSP : โครงสร้างข้อมูล - สำหรับการตรวจจับการแยกระหว่างวัตถุที่เคลื่อนไหวแบบไดนามิกและเรขาคณิตโลกคงที่ ใช้เพื่อการตรวจจับการชนกันและการเรนเดอร์เรขาคณิตอย่างถูกต้องโดยไม่ต้องใช้ zbuffer แต่มันไม่ได้ใช้สำหรับการเรนเดอร์อีกต่อไปเนื่องจากเรามีหน่วยความจำเพียงพอสำหรับบัฟเฟอร์ az ในปัจจุบัน พวกเขากำลังสร้างเทคนิคแตกต่างกันเล็กน้อย แต่ แต่ก็ยังถือว่าเป็นต้นไม้ชนิดเดียวกัน ต้องมีการประมวลผลล่วงหน้า
Octree หรือ Kd-Tree : โครงสร้างข้อมูล - ใช้เพื่อกำหนดว่าวัตถุใดอยู่ใน "เซลล์" หรือพื้นที่เดียวกันเพื่อหลีกเลี่ยงการทำ n ^ 2 ตรวจสอบวัตถุไดนามิกทั้งหมด
สิ่งเหล่านี้ไม่ใช่สิ่งเดียว แต่น่าจะเป็นเรื่องธรรมดาที่สุด นอกจากนี้ยังมีการปรับแต่งมากมายที่ทำให้เครื่องยนต์หลีกเลี่ยงการเรนเดอร์เรขาคณิตโดยทั่วไป แต่ต่อไปนี้เป็นเพียงการคัดเลือกเรขาคณิตและนั่นคือทั้งหมดที่ใช้สำหรับ:
พอร์ทัล : ไม่ใช่โครงสร้างข้อมูลทางเทคนิค แต่ต้องใช้โครงสร้างพิเศษในการเลือกสรร ใช้สำหรับการตรวจสอบการมองเห็นของเรขาคณิตโลกและเรขาคณิตวัตถุแบบไดนามิกจากมุมมอง ต้องมีการประมวลผลล่วงหน้าเพื่อแบ่งโลกออกเป็นส่วน ๆ ที่ฉันคิด แต่ฉันไม่ได้นำไปใช้จริงดังนั้นฉันไม่รู้
Occlusion culling : การปรับให้เหมาะสม - ใช้สำหรับการมองเห็นการคัดสรรสำหรับสิ่งที่คุณต้องการอาจเป็นวัตถุแบบไดนามิก
Regular Viewport culling : Optimization - คัดสรรวัตถุที่ไม่ได้อยู่ในมุมมองของกล้อง
การคัดสรรวิวพอร์ตที่มากขึ้น : การปรับให้เหมาะสม - การคัดสรรวิวพอร์ตปกติสามารถปรับให้เหมาะสมยิ่งขึ้นไปอีก คุณสามารถคัดออกทั้งเซลล์ของแปดที่อยู่ด้านหลังกล้องหรือไม่ในมุมมองของมัน ซึ่งรวมถึงแพทช์ของภูมิประเทศ (ถ้าคุณอยู่นอก) อะไรก็ตามที่ไม่ได้ถูกเลือกโดย octree คุณจะต้องแสดง "การคัดสรรวิวพอร์ตปกติ" จากนั้นสิ่งที่เหลืออยู่คุณจะทำให้
Backface culling : Optimization - คัดรูปทรงเรขาคณิตออกห่างจากกล้องเพื่อป้องกันการแรสเตอร์ โดยทั่วไปแล้วจะทำในฮาร์ดแวร์ถ้าตั้งค่าสถานะการแสดงผลอย่างถูกต้อง
โครงสร้างข้อมูลกรณีพิเศษ:
ต้นไม้ AABB หรือต้นไม้ Sphere : นี่เป็นโครงสร้างข้อมูลกรณีพิเศษ พวกเขาเปลี่ยนรูปร่างเว้าให้เป็นรูปนูน ยกตัวอย่างเช่นตัวละครที่มีกระดูกเป็นเทคนิคเว้า มันแบ่งมันออกเป็นชิ้นเล็กชิ้นน้อย สามารถใช้เป็นการปรับให้เหมาะสมสำหรับการตรวจจับการชนการกำจัดการมองเห็นของวัตถุแบบไดนามิก (โดยทั่วไป) และทำให้ง่ายต่อการทำการทดสอบทางแยกกับเพราะมันนูน สิ่งเหล่านี้จะเข้าไปอยู่ในคำพูดซึ่งเป็นหนึ่งในแปดของวัตถุมักเป็นวัตถุไดนามิก สามารถใช้สิ่งเหล่านี้เพื่อช่วยในการเพิ่มประสิทธิภาพการบดเคี้ยว
ไม่มีเหตุผลว่าทำไมคุณต้องใช้โครงสร้างเดียวเพื่อแสดงทุกอย่าง (เช่นกราฟฉาก) ในความคิดของฉันคุณจะดีกว่าที่จะใช้โครงสร้างข้อมูลที่แตกต่างกันสำหรับงานที่แตกต่างกันแทนที่จะพยายามที่จะใช้หนึ่งต้นไม้วัตถุประสงค์ทั่วไปของบางประเภท ตัวอย่างเช่นเครื่องยนต์ที่ฉันใช้งานอยู่ในปัจจุบันฉันวางแผนที่จะใช้การรวมกันของ BSP / Octree / AABB Tree กับการเพิ่มประสิทธิภาพต่อไปนี้: บดเคี้ยว, วิวพอร์ต, และ, แน่นอน, backface culling นั่นหมายความว่าฉันจะมีต้นไม้ bsp หนึ่งต้นหนึ่ง octree และอาจมีต้นไม้ aabb หลายต้นภายในเดือนตุลาคมนั้น
การเลือกโครงสร้างข้อมูลที่ดีที่สุดและอัลกอริธึม / การปรับให้เหมาะสมน่าจะเป็นสิ่งที่ใหญ่ที่สุดและเป็นประโยชน์มากที่สุดที่คุณสามารถทำได้สำหรับเครื่องยนต์ของคุณ