Çarpışma algılama algoritması
Çarpışma algılama
- Video oyunu programlamada çarpışma algılama çok yaygın bir problemdir
- Karakterlerin birbirinin içinden geçmesini engellemek veya bir fizik motoru uygulamak için gereklidir
Basit yaklaşım 🐥
Performans sorunu
- Nesne sayısı arttıkça performans sorunları ortaya çıkar
- Örneğin, n = 20 olduğunda 190 çifti kontrol etmek gerekir
Çözümü iyileştirme
Sıralama ile optimizasyon
- Nesneleri x koordinatına göre sıralarsanız gereksiz kontrolleri azaltabilirsiniz
- Kod örneği:
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);
}
}
}
Performans analizi
- Sıralama: O(n log n)
- İç döngü: ortalama olarak O(n + m) (
m, x ekseninde çakışan toplam sayıdır)
- Nihai zaman karmaşıklığı: O(n log n + m)
Görsel karşılaştırma
- Tüm çiftlerin küresel olarak kontrol edilmesi ile sıralanmış çift kontrolünün karşılaştırması
- Sıralanmış çift kontrolü çok daha az sayıda denetim gerçekleştirir
GN⁺ özeti
- Bu yazı, oyun geliştirmede çarpışma algılama algoritmalarını nasıl optimize edebileceğini ele alıyor
- Basit O(n^2) algoritmadan başlayıp sıralama yoluyla performansı büyük ölçüde artırıyor
- Oyun geliştiricileri veya yazılım mühendisleri için çok faydalı bilgiler içeriyor
- Benzer işlevlere sahip diğer projeler arasında Box2D ve Bullet Physics bulunuyor
1 yorum
Hacker News yorumları
Yazar, en iyi performans için mergesort veya quicksort gibi "hızlı" sıralama algoritmalarının kullanılmasını öneriyor
Geçmişte benzer bir iş yaptım ama sıralama yerine her yön için indeks listeleri tuttum
objectIndicesSortedByLeftEdge/RightEdge/TopEdge/BottomEdgegibi 4 liste varBu yazı gerçekten çok iyi derlenmiş
Sürekli çarpışma algılama ile ilgili dokümanları okumaktan hep keyif aldım
İllüstrasyonların kullanımı hoştu
Part 2: https://leanrada.com/notes/sweep-and-prune-2/
"Bu basit algoritma Big O terimleriyle O(n^2) zamanda çalışır" iddiasını sorguluyorum
Bunun, potansiyel çarpışanları azaltmak için quadtree kullanmaya benzer bir yöntem olup olmadığını merak ettim
Doğrusal programlama yöntemlerinin hiç önerilip önerilmediğini merak ettim
Bu web sitesi dikkatimi iyi anlamda dağıttı