เมื่อไม่นานมานี้ฉันกำลังทำงานกับนักแม่นปืน 2d ที่รวดเร็วและฉันเจอปัญหาอันยิ่งใหญ่ ตรวจจับการชนกัน แน่นอนว่ามันใช้งานได้ แต่ช้ามาก เป้าหมายของฉันคือ: มีศัตรูจำนวนมากบนหน้าจอและให้พวกเขาไม่ได้สัมผัสกัน ศัตรูทั้งหมดกำลังไล่ตามเอนทิตีของผู้เล่น ส่วนใหญ่มีความเร็วเท่ากันดังนั้นไม่ช้าก็เร็วพวกเขาทั้งหมดก็ลงเอยด้วยการเว้นวรรคขณะไล่ล่าผู้เล่น สิ่งนี้ทำให้ปัจจัยความสนุกลดลงอย่างมากสำหรับผู้เล่นดูเหมือนว่าคุณจะถูกไล่ล่าโดยศัตรูเพียงคนเดียวเท่านั้น เพื่อป้องกันไม่ให้พวกเขาใช้พื้นที่เดียวกันฉันได้เพิ่มการตรวจจับการชนกัน (การตรวจจับ 2D ขั้นพื้นฐานมากซึ่งเป็นวิธีเดียวที่ฉันรู้) ซึ่งก็คือ
Enemy class update method
Loop through all enemies (continue; if the loop points at this object)
If enemy object intersects with this object
Push enemy object away from this enemy object
มันใช้งานได้ดี ตราบใดที่ฉันมี <เอนทิตีศัตรู <200 เท่านั้นนั่นคือ เมื่อฉันเข้าใกล้ศัตรู 300-350 หน่วยอัตราเฟรมของฉันเริ่มลดลงอย่างหนัก ครั้งแรกฉันคิดว่าการเรนเดอร์ไม่ดี สิ่งนี้ไม่ได้ช่วยเลยแน่นอนว่าฉันรู้ว่ามันเป็นวิธีการอัพเดท ส่วนที่หนักเพียงอย่างเดียวในวิธีการอัปเดตของพวกเขาคือชิ้นส่วนแต่ละตัวของศัตรูรอบด้าน เมื่อฉันเข้าใกล้ศัตรู 300 คนเกมจะทำซ้ำขั้นตอนที่ 90000 (300x300) ของฉัน ~
ฉันแน่ใจว่าต้องมีวิธีอื่นในการตรวจสอบการชนกันของข้อมูล แม้ว่าฉันจะไม่ทราบวิธีการ หน้าที่ฉันค้นหาเป็นเรื่องเกี่ยวกับวิธีการชนระหว่างวัตถุสองอย่างจริงหรือวิธีตรวจสอบการชนกันระหว่างวัตถุและไทล์ ฉันรู้สองสิ่งนี้แล้ว
TL; DR? ฉันจะตรวจสอบการชนกันของข้อมูลระหว่างหน่วยงานจำนวนมากได้อย่างไร
การแก้ไขอย่างรวดเร็ว: ถ้ามันเป็นความช่วยเหลือใด ๆ ฉันใช้ C # XNA