ควอดทรีจะเป็นที่นิยมมากกว่าการแปลงพื้นที่เมื่อใด


12

ฉันกำลังสร้าง platformer 2d พร้อมวัตถุจำนวนมากในเวลาเดียวกัน ตรวจพบการชนของ AABB ทั้งหมด ก่อนอื่นฉันลองควอดทรีเพื่อลดจำนวนวัตถุที่จะตรวจสอบลองใช้การกำหนดค่าที่แตกต่างกันสองสามอย่าง แต่ก็ไม่ได้มีประสิทธิภาพเท่าที่ฉันต้องการ ฉันใช้แฮชเชิงพื้นที่และมันมีประสิทธิภาพมากกว่าจำนวนของวัตถุที่จะตรวจสอบการชนกันของแต่ละครั้งลดลงอย่างเห็นได้ชัด

มีกรณีเมื่อทำการตรวจจับการชนกัน 2d โดยใช้ควอดทรีเป็นที่นิยมมากกว่า hashing อวกาศ? จากการทดสอบของฉันดูเหมือนว่าพื้นที่ว่างเปล่ามักจะจบลงด้วยวัตถุน้อยลงที่จะทดสอบการชนกันหรือไม่

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

นี่คือการเปรียบเทียบฉันมองข้ามบางสิ่งไปหรือเปล่า http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

คำตอบ:


12

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

ตัวอย่างเช่นสมมติว่าฉันมีต้นไม้รูปสี่เหลี่ยมที่มีหกระดับ ที่ระดับต่ำสุดนั่นคือกล่องขนาด 32x32 1024 กล่องประกอบด้วยส่วนล่างที่มีรายละเอียดมากที่สุด สำหรับการเปรียบเทียบเราจะพิจารณา "แฮ็กพื้นที่" - กริดแบบแบนซึ่งมี 32x32 กล่องรวม 1024 กล่อง (ต้นไม้รูปสี่เหลี่ยมมีมากกว่า 1024 กล่องทั้งหมดเนื่องจากมันยังมีกล่องที่มีขนาดใหญ่กว่าในระดับที่สูงกว่า)

สมมติว่าไม่มีวัตถุที่สามารถชนกันได้ในระบบ - กล่องทั้งหมดของต้นไม้รูปสี่เหลี่ยมและตารางแบนของเรานั้นว่างเปล่าทั้งหมด

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

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

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

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


5
สรุปย่อสำหรับคนที่ขี้เกียจอย่างยิ่ง: Quadtrees จัดการกับวัตถุที่มีขนาดต่างกันเร็วขึ้น
Anko

ขอบคุณนี่เป็นคำตอบที่ยอดเยี่ยม! ขนาดที่เท่ากันของวัตถุเป็นสิ่งที่ฉันสงสัย
Chris

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

1
@malthe หากคุณยืนยันที่จะใช้การใช้งานต้นไม้แบบควอดทรีซึ่งไม่สามารถทำได้ในการสืบค้นประเภทนี้ก่อนหน้านี้ให้ใช้แฮชปริภูมิแทน คุณจะประหยัดต้นทุนหน่วยความจำ 33% และคุณจะไม่ได้รับประโยชน์ใด ๆ หรือมิฉะนั้นคุณสามารถคลายความบริสุทธิ์ทางอุดมการณ์ของคุณเพียงแค่ smidge และใช้ต้นไม้รูปสี่เหลี่ยมที่สามารถเริ่มต้นได้โดยการให้แต่ละโหนดติดตามจำนวนเอนทิตีในลูกของมัน ยกเลิกการเชื่อมโยงจากต้นไม้จนกว่าจะต้องการ แท้จริง มากกว่าห้าปีต่อมา
เทรเวอร์พาวเวล

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