Saya tahu tentang pohon-pohon BSP, Octrees dan Portal yang mana digunakan untuk waktu yang lama. Tetapi game modern masih menggunakan sistem ini atau mereka menggunakan hal-hal baru?
Jika memungkinkan dengan pro dan kontra, pertimbangkan rendering dan deteksi tabrakan.
Jawaban:
Ya, mesin Unreal 3 misalnya masih menggunakan BSP - terutama karena digunakan selama proses CSG. Doom3 / id tech 4 menggunakan portal, dan saya pikir saya telah membaca sesuatu yang id Tech 5 kembali ke pohon BSP. Ada beberapa gim yang menggunakan oktri juga. Dalam permainan, pemahaman saya adalah bahwa UE3 pindah ke pendekatan yang lebih dinamis dengan permintaan oklusi, tapi saya akan terkejut jika mereka tidak menggunakan BSP untuk setidaknya menentukan jerat statis mana yang terlihat. Game lain mungkin hanya menggunakan pemusnahan view-frustum (Civilization misalnya.) Ini benar-benar tergantung pada jenis permainan yang Anda lihat.
Alasan bahwa BSP dan yang lainnya masih ada adalah karena Anda tidak dapat melakukan jauh lebih baik. Jika Anda memiliki geometri statis, BSP sangat bagus jika Anda membuatnya dengan benar. Ini mengharuskan Anda untuk menulis pembangun BSP, yang rumit (tetapi mungkin terjadi secara gratis jika solusi CSG Anda menggunakan satu!) Octrees dan solusi yang lebih dinamis (seperti mengandalkan permintaan oklusi untuk semuanya) lebih mudah untuk diterapkan, memiliki runtime yang lebih tinggi biaya tetapi tidak memerlukan pra-pemrosesan tingkat (mahal). Itu adalah trade-off yang bersedia dilakukan beberapa game (Crytek misalnya ingin semuanya berjalan secara real-time, sehingga mereka tidak menghabiskan waktu pemrosesan untuk membangun struktur akselerasi statis.) Pendekatan runtime lain adalah misalnya rasterisasi perangkat lunak aktif. CPU dan melakukan permintaan oklusi pada CPU (ini digunakan oleh mesin Frostbite.)
Untuk pendekatan yang benar-benar modern, lihat Umbra , yang merupakan middleware untuk kueri visibilitas. Jika Anda mencari di web sedikit, Anda harus menemukan beberapa tesis master yang menggambarkan awal mula Umbra.
Intinya: Apakah Anda ingin menggunakan BSP / Octree / no AS akan sangat tergantung pada jenis permainan yang ingin Anda buat. Jika level Anda sebagian besar statis, Anda harus mengambil keuntungan dari itu dan membangun beberapa struktur akselerasi statis. Jika semuanya dinamis, tentu saja Anda perlu pendekatan lain.
Untuk deteksi tabrakan, saya akan melihat Bullet dan PhysX dan algoritma pendeteksian tabrakan mereka. Tetapi perasaan saya adalah bahwa solusi fisika kurang terikat pada visibilitas daripada sebelumnya - solusi fisika mungkin ingin menggunakan BVH berbasis GPU, dalam hal ini, tidak ada banyak akal untuk mencoba menggunakannya untuk permintaan visibilitas.
sumber
Jujur saya tidak tahu apa yang mesin generasi berikutnya gunakan hari ini, tapi saya akan memberitahu Anda apa yang saya tahu. Sangat mudah untuk bingung antara optimasi dan struktur data yang digunakan untuk membantu dalam optimasi itu. Semua hal yang disebutkan di bawah ini adalah untuk optimasi, tetapi saya akan menunjukkan yang mana adalah struktur data secara khusus.
BSP : Struktur Data - Untuk mendeteksi persimpangan antara objek bergerak dinamis dan geometri dunia statis. Dulu digunakan untuk kedua deteksi tabrakan dan rendering geometri dengan benar tanpa zbuffer, tetapi tidak lagi digunakan untuk rendering lagi karena kita memiliki cukup memori untuk buffer az sekarang. Meskipun secara teknis dihasilkan sedikit berbeda tetapi masih dianggap jenis pohon yang sama. Membutuhkan preprocessing.
Oktree atau Kd-Tree : Struktur Data - digunakan untuk menentukan objek apa yang ada di "sel" atau area yang sama untuk menghindari melakukan pemeriksaan n ^ 2 pada semua objek dinamis.
Ini bukan satu-satunya, tetapi mungkin yang paling umum. Ada juga banyak optimasi yang memungkinkan mesin menghindari rendering geometri secara umum. Tetapi yang berikut hanya mencabut geometri, dan biasanya hanya itu yang digunakan untuk:
Portal : Tidak secara teknis struktur data, tetapi membutuhkan yang khusus untuk melakukan pemusnahan. Digunakan untuk pemusnahan visibilitas geometri dunia dan geometri objek dinamis dari tampilan. Membutuhkan preprocessing untuk membagi dunia menjadi area yang saya pikir. Tapi saya belum benar-benar menerapkan ini, jadi saya tidak tahu.
Penyisihan oklusi : Optimasi - digunakan untuk visibilitas pemusnahan untuk apa pun yang Anda inginkan, mungkin objek dinamis.
Pemusnahan Tampilan Biasa : Pengoptimalan - memusnahkan objek yang tidak ada dalam tampilan kamera.
Lebih banyak pemusnahan viewport : Optimasi - pemusnahan viewport reguler dapat dioptimalkan lebih jauh dengan menggunakan sebuah octree. Anda dapat menyisihkan seluruh sel oktaf yang ada di belakang kamera atau tidak dalam pandangannya. Ini termasuk bidang medan (jika Anda berada di luar). Apa pun yang tidak dimusnahkan oleh octree Anda akan melakukan "pemusnahan viewport biasa". Lalu, apa pun yang tersisa, Anda akan membuat.
Pemusnahan backface : Optimalisasi - memiringkan geometri menghadap jauh dari kamera untuk mencegah rasterisasi. Biasanya dilakukan di perangkat keras jika status render diatur dengan benar.
Struktur data kasus khusus:
Pohon AABB atau pohon Sphere : Ini adalah jenis struktur data kasus khusus. Mereka mengubah bentuk cekung menjadi cembung. Misalnya karakter dengan tulang secara teknis cekung. Ini memecahnya menjadi potongan-potongan cembung yang lebih kecil. Dapat digunakan sebagai optimisasi untuk deteksi tabrakan, visibilitas pemusnahan objek dinamis (biasanya), dan membuatnya lebih mudah untuk melakukan tes persimpangan karena itu cembung. Ini akan masuk ke dalam katakanlah, sebuah octree karena mereka biasanya objek yang dinamis. Ini juga dapat digunakan untuk membantu dengan optimisasi pemusnahan oklusi.
Tidak ada alasan mengapa Anda harus menggunakan struktur tunggal untuk mewakili semuanya (seperti grafik adegan). Menurut pendapat saya, Anda akan lebih baik menggunakan struktur data yang berbeda untuk tugas yang berbeda daripada mencoba menggunakan satu jenis pohon tujuan umum. Sebagai contoh, mesin yang sedang saya kerjakan saat ini, saya berencana untuk menerapkan kombinasi BSP / Octree / AABB Tree dengan optimisasi berikut: penyumbatan oklusi, viewport, &, tentu saja, pemusnahan backface. Ini berarti saya akan memiliki satu pohon bsp, satu octree, dan mungkin beberapa pohon aabb di dalam octree itu.
Pemilihan struktur data dan algoritma / optimisasi terbaik mungkin merupakan hal terbesar dan paling menguntungkan yang dapat Anda lakukan untuk mesin Anda.
sumber