Algoritme deteksi tabrakan
Deteksi tabrakan
- Dalam pemrograman video game, deteksi tabrakan adalah masalah yang sangat umum
- Ini sangat penting untuk mencegah karakter saling menembus, atau untuk mengimplementasikan physics engine
Pendekatan sederhana 🐥
Masalah performa
- Semakin banyak jumlah objek, semakin besar masalah performa yang muncul
- Misalnya, saat n = 20, perlu memeriksa 190 pasangan
Perbaikan solusi
Optimasi melalui penyortiran
- Dengan mengurutkan objek berdasarkan koordinat x, pemeriksaan yang tidak perlu bisa dikurangi
- Contoh kode:
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);
}
}
}
Analisis performa
- Penyortiran: O(n log n)
- Loop internal: rata-rata O(n + m) (
m adalah total jumlah tumpang tindih pada sumbu x)
- Kompleksitas waktu akhir: O(n log n + m)
Perbandingan visual
- Perbandingan antara pemeriksaan semua pasangan global dan pemeriksaan pasangan yang sudah diurutkan
- Pemeriksaan pasangan yang sudah diurutkan melakukan jauh lebih sedikit pengecekan
Ringkasan GN⁺
- Artikel ini membahas cara mengoptimalkan algoritme deteksi tabrakan dalam pengembangan game
- Dimulai dari algoritme sederhana O(n^2), lalu meningkatkan performa secara signifikan melalui penyortiran
- Informasi ini sangat berguna bagi pengembang game maupun software engineer
- Proyek lain dengan fungsi serupa antara lain Box2D, Bullet Physics, dan lainnya
1 komentar
Opini Hacker News
Penulis menyarankan penggunaan algoritma pengurutan "cepat" seperti mergesort atau quicksort untuk performa optimal
Pernah mengerjakan hal serupa di masa lalu, tetapi alih-alih mengurutkan, mempertahankan daftar indeks untuk tiap arah
objectIndicesSortedByLeftEdge/RightEdge/TopEdge/BottomEdgeTulisan ini benar-benar tersusun dengan baik
Selalu senang membaca dokumen tentang continuous collision detection
Penggunaan ilustrasinya bagus
Part 2: https://leanrada.com/notes/sweep-and-prune-2/
Mempertanyakan klaim bahwa "algoritma sederhana ini berjalan dalam waktu O(n^2) dalam istilah Big O"
Bertanya-tanya apakah metode ini mirip dengan penggunaan quadtree untuk mengurangi calon tabrakan potensial
Bertanya-tanya apakah metode linear programming pernah diusulkan
Terdistraksi oleh situs web ini, dalam arti yang baik