คำตอบที่ถูกต้องนั้นขึ้นอยู่กับเกมจริงที่คุณกำลังออกแบบอยู่และการเลือกเกมหนึ่งไปอีกเกมนั้นจะต้องใช้ทั้งสองอย่างและทำการทำโปรไฟล์เพื่อหาว่าเกมใดที่มีเวลามากขึ้น
การตรวจจับกริดดูเหมือนว่าจะใช้เฉพาะกับการตรวจจับการชนระหว่างวัตถุที่กำลังเคลื่อนที่และพื้นหลังแบบสแตติก ข้อได้เปรียบที่ใหญ่ที่สุดคือพื้นหลังแบบสแตติกจะแสดงเป็นอาร์เรย์หน่วยความจำต่อเนื่องและการค้นหาการชนกันแต่ละครั้งคือ O (1) ที่มีตำแหน่งที่ดีถ้าคุณต้องการอ่านหลาย ๆ ครั้ง (เนื่องจากเอนทิตีครอบคลุมมากกว่าหนึ่งเซลล์ในตาราง) ข้อเสียถ้าพื้นหลังคงที่มีขนาดใหญ่คือตารางสามารถค่อนข้างเปลืองพื้นที่
หากคุณแทนพื้นหลังแบบสแตติกเป็นควอดทรีค่าใช้จ่ายของการค้นหาแต่ละรายการจะเพิ่มขึ้น แต่เนื่องจากบล็อกขนาดใหญ่ของพื้นหลังใช้พื้นที่จำนวนเล็กน้อยความต้องการของหน่วยความจำจึงลดลงและพื้นหลังอื่น ๆ สามารถนั่งใน ขุมทรัพย์ แม้ว่าจะใช้เวลา 10 ครั้งในการที่จะทำการค้นหาในโครงสร้างแบบนั้นถ้ามันอยู่ในแคชมันจะเร็วกว่าการค้นหาครั้งเดียวถึง 10 เท่าด้วยการพลาดแคช
ถ้าฉันต้องเผชิญกับทางเลือก? ฉันไปกับการติดตั้งกริดเพราะมันง่ายที่จะทำโง่ใช้เวลาของฉันกับปัญหาอื่นที่น่าสนใจกว่า ถ้าฉันสังเกตเห็นว่าเกมของฉันทำงานช้าลงเล็กน้อยฉันจะทำโปรไฟล์และดูว่าจะใช้ความช่วยเหลือได้อย่างไร หากดูเหมือนว่าเกมใช้เวลามากในการตรวจจับการชนฉันจะลองใช้งานอื่นเช่น quadtree (หลังจากหมดการแก้ไขที่ง่ายทั้งหมดก่อน) และดูว่าช่วยได้หรือไม่
แก้ไข:ฉันไม่ทราบว่าการตรวจจับการชนกันของกริดนั้นเกี่ยวข้องกับการตรวจจับการชนของเอนทิตีแบบเคลื่อนที่ได้ แต่ฉันจะตอบว่าดัชนีเชิงพื้นที่ (Quadtree) ช่วยปรับปรุงประสิทธิภาพการตรวจจับได้อย่างไรในโซลูชันวนซ้ำ วิธีการแก้ปัญหาไร้เดียงสา (และโดยปกติแล้วจะสมบูรณ์แบบ) ดูเหมือนเป็นแบบนี้:
foreach actor in actorList:
foreach target in actorList:
if (actor != target) and actor.boundingbox intersects target.boundingbox:
actor.doCollision(target)
เห็นได้ชัดว่ามีการแสดงรอบ O (n ^ 2) โดยมีจำนวนนักแสดงที่ยังมีชีวิตอยู่ในเกมรวมถึงกระสุนและยานอวกาศและมนุษย์ต่างดาว นอกจากนี้ยังสามารถรวมถึงสิ่งกีดขวางเคลื่อนที่เล็ก ๆ
วิธีนี้ใช้งานได้ดีอย่างน่าอัศจรรย์ตราบใดที่จำนวนของรายการดังกล่าวมีขนาดเล็กพอสมควร แต่เริ่มดูไม่ดีนักเมื่อมีวัตถุหลายร้อยชิ้นที่ต้องตรวจสอบ ผลลัพธ์ 10 วัตถุในการตรวจสอบการชนเพียง 100 ครั้งและ 100 รายการในการตรวจสอบ 10,000 ครั้ง 1,000 ผลลัพธ์ในหนึ่งล้านเช็ค
ดัชนีเชิงพื้นที่ (เช่นควอดทรี) สามารถระบุรายการที่รวบรวมได้อย่างมีประสิทธิภาพตามความสัมพันธ์ทางเรขาคณิต สิ่งนี้จะเปลี่ยนอัลกอริทึมการชนเป็นดังนี้:
foreach actor in actorList:
foreach target in actorIndex.neighbors(actor.boundingbox):
if (actor != target) and actor.boundingbox intersects target.boundingbox:
actor.doCollision(target)
ประสิทธิภาพของสิ่งนี้ (สมมติว่ามีการแจกแจงแบบเอนทิตีแบบสม่ำเสมอ): โดยปกติคือ O (n ^ 1.5 log (n)) เนื่องจากดัชนีใช้เวลาประมาณ log (n) การเปรียบเทียบกับการสำรวจจะมีเพื่อนบ้าน sqrt (n) เพื่อเปรียบเทียบ และมีนักแสดงอีก n คนที่ต้องตรวจสอบ แม้ว่าตามความเป็นจริงแล้วจำนวนเพื่อนบ้านนั้นค่อนข้าง จำกัด อยู่เสมอเนื่องจากหากเกิดการชนส่วนใหญ่ของวัตถุส่วนใหญ่จะถูกลบหรือย้ายออกจากการปะทะกัน ดังนั้นคุณจะได้รับเพียง O (n log (n)) สำหรับ 10 เอนทิตีคุณทำการเปรียบเทียบ 10 รายการต่อ 100 คุณทำ 200 และ 1,000 คุณ 3000
ดัชนีที่ฉลาดจริง ๆ ยังสามารถรวมการค้นหาเพื่อนบ้านกับการวนซ้ำจำนวนมากและดำเนินการติดต่อกลับในแต่ละเอนทิตีที่ตัดกัน สิ่งนี้จะให้ประสิทธิภาพการทำงานที่ประมาณ O (n) เนื่องจากดัชนีจะถูกสแกนหนึ่งครั้งแทนที่จะเป็นการสอบถาม n ครั้ง