ดูเหมือนว่าคุณกำลังต้องการเรียนรู้เกี่ยวกับต้นไม้!
และฉันกำลังจริงจังถ้าคุณกำลังวนรอบลูกบาศก์ทั้งหมดของคุณคุณควรดูโครงสร้างข้อมูลเชิงพื้นที่ต่างๆ สำหรับกรณีนี้วิธีที่ดีที่สุดที่จะจินตนาการถึงโลกลูกบาศก์ของคุณคือเหมือนต้นไม้
ก่อนที่เราจะไปถึงเหตุผลว่าทำไมให้คิดเกี่ยวกับปัญหาของเรา เรากำลังมองหาวิธีแก้ปัญหาที่เราสามารถดึงรายชื่อของลูกบาศก์ที่อยู่ใกล้เคียงซึ่งผู้เล่นอาจจะชนกันด้วยค่าใช้จ่ายเพียงเล็กน้อยเท่าที่จะทำได้ รายการนี้ควรมีขนาดเล็ก แต่แม่นยำที่สุด
ตอนนี้เพื่อหาโซนนี้เราต้องแมปพื้นที่ประสานงานของผู้เล่นของเราไปยังพื้นที่ประสานงานของแผนที่ลูกบาศก์ นั่นคือเราจำเป็นต้องแมปตำแหน่งจุดลอยตัวของผู้เล่นไปยังดัชนีแยกของอาร์เรย์หลายมิติของคิวบ์ (สัญกรณ์ตัวอย่างอาจจะเป็นworld[31][31][31]
เช่นตรงกลางที่แน่นอนสำหรับอาร์เรย์ 64 มิติหลายมิติ 64 * 64 * 64)
เราสามารถคำนวณบล็อกโดยรอบโดยใช้การจัดทำดัชนีแบบแยกกันแบบนี้อาจสุ่มตัวอย่างเฉพาะลูกบาศก์ที่อยู่ใกล้เคียง แต่ก็ยังต้องการการคำนวณซ้ำอย่างต่อเนื่องและไม่อนุญาตสำหรับวัตถุใด ๆ ที่ไม่ต่อเนื่องในตำแหน่ง แผนที่).
สถานการณ์ที่เหมาะเป็นชุดของบุ้งกี๋ซึ่งประกอบด้วยชุดของก้อนสำหรับเฉพาะส่วนของแผนที่ก้อนของเราแบ่งเท่า ๆ กันดังนั้นแทนที่จะคำนวณพื้นที่โดยรอบเราก็ย้ายเข้าและออกของทั้งโซน สำหรับการคำนวณที่ไม่สำคัญการเก็บข้อมูลของเราเช่นนี้สามารถกำจัดการวนซ้ำทั้งหมดและเฉพาะชุดบุคคลเหล่านี้ที่อยู่ใกล้เคียง
คำถามคือ: เราจะใช้สิ่งนี้ได้อย่างไร
สำหรับ 64 * 64 * 64 ของโลกคิดว่ามันเสียลงถึง 8 * 8 * 8 โซน ซึ่งหมายความว่าในโลกของคุณคุณจะมี 8 โซนต่อแกน (X, Y, Z) แต่ละโซนเหล่านี้จะมี 8 คิวบ์สามารถเรียกคืนได้ง่ายโดยดัชนีใหม่ที่ง่ายนี้
หากคุณต้องการดำเนินการกับชุดของลูกบาศก์ใกล้เคียงแทนการวนซ้ำทุกคิวบ์ในโลกของคุณคุณสามารถวนซ้ำโซนเหล่านี้ทำลายจำนวนการทำซ้ำสูงสุดจากเดิม 64 * 64 * 64 (262144) เป็น เพียง 520 (8 * 8 * 8 + 8)
ตอนนี้ซูมออกจากโลกของโซนนี้และวางโซนออกเป็นขนาดใหญ่สุดโซน ; ประเด็นแต่ละซุปเปอร์โซนมี 2 * 2 * 2 ประจำโซน ในขณะที่โลกของคุณในปัจจุบันมี 512 (8 * 8 * 8) โซนเราสามารถแบ่ง 8 * 8 * 8 โซนออกเป็น 64 (4 * 4 * 4) ซุปเปอร์โซนโดยการหาร 8 โซน 2 โซนต่อซุปเปอร์โซน ใช้ตรรกะเดียวกันจากข้างต้นนี้จะทำลายซ้ำสูงสุด 512-8 เพื่อหาสิ่งที่ซุปเปอร์โซน ; และสูงสุด 64 เพื่อค้นหาเขตดำเนินการ(รวมสูงสุด 72)! คุณสามารถดูว่านี่ช่วยให้คุณประหยัดได้มากซ้ำแล้วซ้ำอีก (262144: 72)
ฉันแน่ใจว่าคุณสามารถเห็นได้ว่าต้นไม้มีประโยชน์อย่างไร แต่ละโซนเป็นสาขาบนต้นไม้โดยที่แต่ละโซนจะเป็นสาขาก่อนหน้า คุณเพียงแค่สำรวจต้นไม้เพื่อค้นหาสิ่งที่คุณต้องการ ใช้ชุดข้อมูลขนาดเล็กเพื่อลดต้นทุนโดยรวม
แผนภาพด้านล่างจะช่วยให้คุณเห็นภาพแนวคิด (ภาพจากWikipedia: Octrees ):
Disclaimer:
ในการตั้งค่าที่เหมาะสมดังที่ voxel-world วางไว้ในอาร์เรย์หลายมิติที่มีขนาดคงที่คุณสามารถสอบถามตำแหน่งของผู้เล่นได้จากนั้นทำดัชนีบล็อกรอบ ๆ ด้วยค่าใช้จ่าย O (1)! (ดูคำอธิบาย Olhovskys) แต่สิ่งนี้จะยากขึ้นเมื่อคุณเริ่มพิจารณาว่าโลกของคุณมีขนาดคงที่ในเกม voxel; และคุณอาจต้องการโครงสร้างข้อมูลของคุณเพื่อให้สามารถโหลดซุปเปอร์โซนทั้งหมดจาก HDD ไปยังหน่วยความจำ ไม่เหมือนกับอาเรย์หลายมิติที่มีขนาดคงที่ต้นไม้สามารถให้สิ่งนี้ได้โดยไม่ต้องใช้เวลามากเกินไปในอัลกอริธึมผสม