ใช้อัลกอริทึมการแบ่งพาร์ติชันหนึ่งในพื้นที่ทั่วไปเช่น Quadtree, Octree, BSP tree หรือแม้แต่ระบบกริดที่เรียบง่าย แต่ละคนมีข้อดีและข้อเสียของตนเองสำหรับแต่ละสถานการณ์ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับพวกเขาในหนังสือเหล่านี้
โดยทั่วไป (หรือเคยได้ยินฉันไม่คุ้นเคยกับเหตุผลที่อยู่เบื้องหลัง) Quadtree หรือ Octree เหมาะสำหรับสภาพแวดล้อมกลางแจ้งในขณะที่ต้นไม้ BSP เหมาะกับฉากในร่มที่ดีกว่า และตัวเลือกระหว่างการใช้ Quadtree หรือ Octree ขึ้นอยู่กับว่าโลกของคุณอยู่ในระดับใด หากมีการเปลี่ยนแปลงเล็กน้อยในแกน Y โดยใช้ Octree จะสิ้นเปลือง Octree นั้นเป็น Quadtree ที่มีมิติเพิ่มเติม
สุดท้ายอย่ามองข้ามความเรียบง่ายของโซลูชันกริด หลายคนไม่สนใจว่าบางครั้งกริดธรรมดาอาจเพียงพอ (และมีประสิทธิภาพมากขึ้น) สำหรับปัญหาของพวกเขาและข้ามไปยังโซลูชันที่ซับซ้อนมากขึ้นแทน
การใช้กริดนั้นประกอบด้วยการแบ่งโลกออกเป็นส่วน ๆ เว้นระยะเท่ากันและจัดเก็บเอนทิตีในภูมิภาคที่เหมาะสมของโลก จากนั้นเมื่อได้รับตำแหน่งการค้นหาหน่วยงานที่อยู่ใกล้เคียงจะเป็นเรื่องของการวนซ้ำพื้นที่ที่ตัดรัศมีการค้นหาของคุณ
สมมติว่าโลกของคุณอยู่ในช่วง (-1000, -1000) ถึง (1,000, 1000) ในระนาบ XZ คุณสามารถแบ่งมันเป็นกริด 10 × 10 ได้เช่น:
var grid = new List<Entity>[10, 10];
จากนั้นคุณจะวางเอนทิตีลงในเซลล์ที่เหมาะสมในตาราง ตัวอย่างเช่นเอนทิตีที่มี XZ (-1000, -1000) จะตกอยู่ในเซลล์ (0,0) ในขณะที่เอนทิตีที่มี XZ (1000, 1000) จะตกอยู่ในเซลล์ (9, 9) จากนั้นเมื่อได้รับตำแหน่งและรัศมีในโลกคุณสามารถกำหนดว่าเซลล์ใดที่ถูกตัดกันโดย "วงกลม" นี้และวนซ้ำไปเรื่อย ๆ กับเซลล์เหล่านั้น
อย่างไรก็ตามศึกษาทางเลือกทั้งหมดและเลือกสิ่งที่ดูเหมือนจะเหมาะกับเกมของคุณดีกว่า ฉันยอมรับว่าฉันยังไม่มีความรู้เพียงพอในเรื่องที่จะตัดสินใจว่าอัลกอริทึมแบบใดที่จะดีที่สุดสำหรับคุณ
แก้ไขพบสิ่งนี้ในฟอรัมอื่นและอาจช่วยคุณตัดสินใจ:
กริดทำงานได้ดีที่สุดเมื่อวัตถุส่วนใหญ่มีขนาดพอดีกับตารางกริดและการกระจายนั้นเป็นเนื้อเดียวกัน ในทางกลับกันควอดทรีจะทำงานเมื่อวัตถุมีขนาดตัวแปรหรือเป็นกลุ่มในพื้นที่ขนาดเล็ก
จากคำอธิบายปัญหาที่คลุมเครือของคุณฉันก็พิงกับโซลูชันกริดเช่นกัน (ซึ่งก็คือสมมติว่าหน่วยมีขนาดเล็กและกระจายอย่างเป็นเนื้อเดียวกัน)