KD-Tree กับ Quadtree แบบไดนามิกเต็มรูปแบบ?


11

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

ฉันได้ดู KD-Trees และ Quadtrees (โดยเฉพาะ Point Quadtrees) ฉันยังคงพยายามที่จะเรียนรู้รายละเอียดเกี่ยวกับวิธีการทำงานของพวกเขา แต่จนถึงตอนนี้ Point Quadtrees ก็เหมาะสมกับฉันมากที่สุด อย่างไรก็ตามฉันได้รับความประทับใจว่า KD-Trees นั้นเร็วกว่าการค้นหาซึ่งสำคัญกับจำนวนคะแนนที่ฉันมีในต้นไม้

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

ฉันสงสัยว่ามันจะดีกว่าไหมในกรณีนี้ที่จะตัดต้นไม้แต่ละเฟรมและสร้างใหม่จากศูนย์แทนที่จะลองปรับสมดุลทุก ๆ จุดในต้นไม้ ถ้า Quadtree เร็วกว่าที่จะปรับสมดุลนั่นหมายความว่ามันเร็วกว่าในการสร้างจากศูนย์หรือไม่ ถ้าเป็นเช่นนั้นสิ่งนี้อาจมีความสำคัญต่อประสิทธิภาพมากกว่าความเร็วในการค้นหาของ KD-Tree ขึ้นอยู่กับว่าต้องสร้างภาระมากแค่ไหน แต่ฉันไม่รู้ ...

คำตอบ:


12

ต้นไม้ KD นั้นแตกต่างไม่มากพอที่จะพิจารณาได้อย่างตรงไปตรงมา การย้ายบางยูนิตสามารถทำให้คุณต้องสร้าง KD-Tree ใหม่ทั้งหมด นอกจากนี้ต้นไม้ KD มีประสิทธิภาพมากสำหรับการค้นหา แต่ไม่มากสำหรับการค้นหาเพื่อนบ้าน

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

หาก แต่คุณสนใจที่จะค้นหาทุกหน่วยภายในรัศมีrคงที่คุณไม่จำเป็นต้องใช้ quadtree และ kd-tree ทันที คุณก็สามารถสร้างอาร์เรย์ 2 มิติของเซลล์ด้านของความยาวRและสแต็คหน่วยงานของคุณในแต่ละเซลล์ตามตำแหน่งของพวกเขา ด้วยวิธีนี้คุณมีเซลล์ที่แย่ที่สุด 9 เซลล์ในการค้นหา เฉพาะในกรณีที่แผนที่ของคุณมีขนาดใหญ่กริดนั้นจะใหญ่เกินกว่าที่จะใช้งานได้

มีโครงสร้างที่แตกต่างอย่างสิ้นเชิงอีกสองโครงสร้างที่เราไม่ได้พูดถึง: AABBs แบบลำดับชั้นและตารางแฮช หากต้นกำเนิดของแต่ละ AABB แบบลำดับชั้นนั้นสัมพันธ์กับพาเรนต์ AABB มันมีข้อได้เปรียบที่ว่าถ้ากลุ่มขนาดใหญ่ของหน่วยยังคงอยู่ในรูปแบบคุณก็ไม่จำเป็นต้องอัปเดต AABB ขนาดเล็กเนื่องจากมันยังคงอยู่ในตำแหน่งเดียวกัน แน่นอนว่าการหมุนการก่อตัวอาจทำให้เกิดการอัปเดตจำนวนมากในกรณีนั้นการใช้งานของโวลุ่มที่มีขอบเขตอื่น ๆ เช่นทรงกลมหรือกล่องขอบที่มุ่งเน้น (OBB) อาจมีประสิทธิภาพมากกว่า

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

ฉันจะทำอย่างไร ฉันอาจเริ่มต้นด้วยตารางง่าย ๆ และเมื่อฉันต้องการฉันจะอัปเกรดเป็น quadtree และถ้าฉันต้องการฉันจะรวมกับลำดับชั้นของขอบเขตที่มีขอบเขตภายใต้ขีด จำกัด บางส่วน: ควอดทรีทำงานได้ดี สเกล, ขอบเขตที่สัมพันธ์กันทำงานได้ดีในขนาดเล็ก ทำมันค่อย ๆ ผมไม่ได้มีการใช้จ่ายชั่วโมงจากการเริ่มต้นที่จะได้รับโครงสร้างข้อมูลที่ดีที่สุดทันที


ขอบคุณ! ฉันไม่เคยได้ยินเกี่ยวกับ AABBs แบบลำดับชั้นและตารางแฮชที่ละเอียดอ่อนในพื้นที่ฉันจะมองหาพวกเขาสำหรับอนาคต สำหรับตอนนี้ฉันจะใช้กริดแบบง่ายๆและจะขยายหากจำเป็นตามที่คุณพูดถึง :)
Nairou

4

ข้อเสนอแนะของLærneนั้นยอดเยี่ยม แต่ฉันขอแนะนำต้นไม้ไดรฟ์ที่มีขอบเขตแบบไดนามิกของ AABB แนวคิดของไดรฟ์ข้อมูลไดรฟ์ข้อมูลขอบเขตแบบไดนามิกเก็บแผนภูมิสมดุลของโหนดซึ่งสามารถสอบถามได้ตลอดเวลาสำหรับองค์ประกอบใกล้โดยผ่าน AABB และดึงคู่ที่ทับซ้อนกัน ต้นไม้ไม่ได้สร้างใหม่ทุกเฟรม แต่ AABB ของแต่ละโหนดจะพองตัวเล็กน้อยเมื่อใส่ลงในต้นไม้และต้นไม้จะถูกสร้างขึ้นมาใหม่เมื่อใดก็ตามที่ AABB จริงของโหนดนั้นไม่มีอยู่ใน AABB ที่สูงเกินจริงอีกต่อไป ฉันใช้มันในเครื่องมือฟิสิกส์ของฉันและมันใช้งานได้ดี

ซอร์สโค้ด Box2D มีการนำมาใช้อย่างมาก

https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Collision/b2DynamicTree.h

นี่คือการตรวจสอบการใช้งานที่ดี:

http://www.randygaul.net/2013/08/06/dynamic-aabb-tree/


ใช่นั่นคือสิ่งที่ฉันหมายถึงมากขึ้นหรือน้อยลงโดย AABB ลำดับชั้นฉันไม่แม่นยำมาก โอ้และในหน่วย RTS มักจะเป็นมือถือ แต่ในรูปแบบ ดังนั้นการใช้พิกัดที่สัมพันธ์กับโหนด AABB หลักจึงค่อนข้างมีประสิทธิภาพโดยมีระยะขอบผิดพลาด "เงินเฟ้อ"
Lærne

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