Instancing meningkatkan kinerja (secara signifikan) ketika merender banyak (hunders? Ribuan?) Salinan dari jala yang sama sekaligus. Tetapi berapa banyak overhead yang dimilikinya ketika merender tepat satu salinan dengan satu panggilan draw? Apakah ide yang baik atau buruk menggunakan instancing untuk semua geometri yang dihasilkan oleh mesin?
Sunting: Katakanlah kita sedang membuat game FPS. Sebagian besar benda hanya memiliki satu contoh: pisau, pistol, senapan mesin, bangunan dan menara radio. Tetapi ada juga beberapa objek dengan banyak contoh: pohon (misalnya 3 jenis pohon dengan ratusan contoh), rumput dan sebagainya ... Yang saya maksudkan adalah: alih-alih memberikan objek satu arah dengan cara "tradisional" dan pohon dan rumput menggunakan instancing, kami membuat semuanya menggunakan instancing. Jadi menara radio kami hanya memiliki satu instance (yang informasinya kami simpan dalam buffer data instan) dan kami membuat menara itu menggunakan semacam DrawInstanced()
panggilan dengan jumlah instance sama 1
. Sama dengan semua objek lain (tentu saja, pohon dan rumput memiliki banyak instance).
Jadi pertanyaan saya adalah: apakah ide yang buruk untuk menggambar satu instance dari objek menggunakan instancing? Apakah instancing memiliki overhead yang terlalu banyak (berdasarkan ingatan dan kinerja) atau apakah dengan cara apa pun tidak diinginkan untuk me-render objek instance tunggal?
sumber
(Pada sistem saya, tidak mengujinya di tempat lain) Di GL, memasang jala tunggal (menggambar dengan jumlah = 1) memiliki beberapa overhead yang buruk, tapi saya tidak tahu dari mana asalnya. Saya sangat menyarankan untuk tidak melakukannya.
Saya menguji ini dalam aplikasi praktis beberapa bulan yang lalu. Saya mengkodekan beberapa algoritma penerangan global dalam adegan Crytek Sponza, yang terdiri dari kira-kira 350 atau lebih jerat (tidak ingat persis), di mana pasangan berbagi beberapa contoh. Pada awalnya saya melakukannya seperti yang Anda sarankan, contoh saja semuanya dan menggambar sisanya dengan jumlah contoh 1, karena sedikit menyederhanakan kode rendering.
Kemudian ketika mengoptimalkan penyaji, hanya beralih dari memunculkan jumlah = 1 objek untuk mengirimkannya dengan cara biasa menyelamatkan saya sekitar 3,5 milidetik per frame senilai waktu pada i7 3770k (dan GTX 770). Mengalihkan jerat dengan banyak contoh untuk hanya melakukannya dengan cara tradisional menyelamatkan saya 0,5 ms. Secara keseluruhan aplikasi berubah dari ~ 120 FPS menjadi sekitar ~ 230 FPS.
Angka-angka ini tentu saja selalu tergantung pada di mana hambatan dalam aplikasi Anda, dan 0,5ms yang terakhir mungkin benar-benar menjadi lambat dalam aplikasi di mana Anda sangat terikat panggilan-draw. Tetapi sebaliknya, dalam pengalaman saya, instancing memiliki overhead yang buruk jika Anda tidak menggambar banyak hal sekaligus.
sumber
Anda dapat yakin bahwa menggambar objek tunggal yang dipasang lebih mahal daripada menggambar objek tunggal secara normal. Untuk pemasangan GPU sedang mempersiapkan sejumlah besar objek dan persiapan ini akan berbeda dari satu objek. Namun seberapa besar kesenjangan kinerja ini hanya dapat ditemukan dengan bereksperimen dan sangat tergantung pada pengaturan rendering aktual Anda. Satu-satunya cara untuk mengetahui dengan pasti adalah dengan mengujinya sendiri. Mematok panggilan undian tunggal sulit di sini adalah beberapa ide tentang bagaimana Anda dapat melanjutkan.
sumber
Sudah 4 tahun ... dan saya pikir aman untuk mengatakan bahwa tidak apa-apa untuk mengirim panggilan "instances" dengan 1. Seperti yang mungkin Anda perhatikan, API baru DX12 dan Vk keduanya memiliki jumlah instance yang dapat dari 0 hingga NUM_INSTANCES . Perhatikan juga bahwa tidak ada DrawIndexed (...) .
EDIT
Sebagai peringatan, hal di atas mungkin baik-baik saja dengan API modern ini, mungkin menggunakan sesuatu yang lama seperti Gl <3.3 atau mungkin DX11 akan memerlukan profil seperti yang disebutkan oleh pengguna lain.
sumber