อัลกอริทึมการตรวจจับการชน
การตรวจจับการชน
- ในการเขียนโปรแกรมวิดีโอเกม การตรวจจับการชนเป็นปัญหาที่พบได้บ่อยมาก
- เป็นสิ่งจำเป็นในการป้องกันไม่ให้ตัวละครทะลุผ่านกัน หรือใช้สร้าง physics engine
แนวทางแบบง่าย 🐥
ปัญหาด้านประสิทธิภาพ
- ยิ่งจำนวนวัตถุมากขึ้น ก็ยิ่งเกิดปัญหาด้านประสิทธิภาพ
- ตัวอย่างเช่น เมื่อ n = 20 จะต้องตรวจสอบ 190 คู่
การปรับปรุงวิธีแก้ปัญหา
การเพิ่มประสิทธิภาพด้วยการจัดเรียง
- หากจัดเรียงวัตถุตามพิกัด x จะสามารถลดการตรวจสอบที่ไม่จำเป็นได้
- ตัวอย่างโค้ด:
sortByLeft(balls);
for (let i = 0; i < balls.length; i++) {
const ball1 = balls[i];
for (let j = i + 1; j < balls.length; j++) {
const ball2 = balls[j];
if (ball2.left > ball1.right) break;
if (intersects(ball1, ball2)) {
bounce(ball1, ball2);
}
}
}
การวิเคราะห์ประสิทธิภาพ
- การจัดเรียง: O(n log n)
- ลูปชั้นใน: โดยเฉลี่ย O(n + m) (m คือจำนวนทั้งหมดที่ซ้อนทับกันบนแกน x)
- ความซับซ้อนเชิงเวลาสุดท้าย: O(n log n + m)
การเปรียบเทียบแบบภาพ
- การเปรียบเทียบระหว่างการตรวจสอบทุกคู่ทั่วทั้งระบบกับการตรวจสอบคู่หลังจัดเรียง
- การตรวจสอบคู่หลังจัดเรียงใช้จำนวนการตรวจสอบน้อยกว่ามาก
สรุปโดย GN⁺
- บทความนี้กล่าวถึงวิธีเพิ่มประสิทธิภาพอัลกอริทึมการตรวจจับการชนในการพัฒนาเกม
- เริ่มจากอัลกอริทึมแบบง่าย O(n^2) แล้วปรับปรุงประสิทธิภาพอย่างมากด้วยการจัดเรียง
- เป็นข้อมูลที่มีประโยชน์มากสำหรับนักพัฒนาเกมหรือวิศวกรซอฟต์แวร์
- โปรเจ็กต์อื่นที่มีความสามารถคล้ายกัน เช่น Box2D, Bullet Physics เป็นต้น
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ผู้เขียนแนะนำให้ใช้อัลกอริทึมการเรียงลำดับที่ "เร็ว" อย่าง mergesort หรือ quicksort เพื่อให้ได้ประสิทธิภาพสูงสุด
เคยทำงานลักษณะคล้ายกันมาก่อน แต่ใช้การเก็บรายการดัชนีสำหรับแต่ละทิศทางแทนการเรียงลำดับ
objectIndicesSortedByLeftEdge/RightEdge/TopEdge/BottomEdgeบทความนี้เรียบเรียงมาได้ดีมาก
ชอบอ่านเอกสารเกี่ยวกับ continuous collision detection อยู่เสมอ
ชอบการใช้ภาพประกอบ
Part 2: https://leanrada.com/notes/sweep-and-prune-2/
ตั้งข้อสงสัยกับข้อความที่ว่า "อัลกอริทึมง่าย ๆ นี้ทำงานในเวลา O(n^2) ในความหมายของ Big O"
สงสัยว่าวิธีนี้คล้ายกับการใช้ quadtree เพื่อลดจำนวนตัวที่อาจชนกันหรือไม่
สงสัยว่าเคยมีการเสนอวิธีแบบ linear programming ไว้หรือไม่
เว็บไซต์นี้ทำให้เผลอวอกแวกไปในทางที่ดี