Biaya praktis efek pertukaran

16

Saya menggunakan XNA untuk proyek-proyek saya dan di forum-forum itu saya terkadang melihat referensi ke fakta bahwa bertukar efek untuk mesh memiliki biaya yang relatif tinggi, yang mengejutkan saya karena saya berpikir untuk menukar efek hanyalah sebuah kasus menyalin program shader pengganti ke GPU bersama dengan parameter yang sesuai.

Saya bertanya-tanya apakah seseorang dapat menjelaskan dengan tepat apa yang mahal dari proses ini? Dan menempatkan, jika mungkin, 'relatif' ke dalam konteks?

Misalnya, saya ingin menggunakan shader pendek untuk membantu memetik, saya akan:

  1. Ubah efek pada setiap objek, buat warna unik untuk mengidentifikasinya dan berikan ke shader.
  2. Gambar semua objek ke target render dalam memori.
  3. Dapatkan warna dari target dan gunakan untuk mencari objek yang dipilih.

Berapa bagian dari total waktu yang dibutuhkan untuk menyelesaikan proses yang akan dihabiskan menukar shader? Naluri saya akan mengatakan bahwa merender adegan lagi, tidak peduli sesederhana apa shadernya, akan menjadi urutan besarnya lebih lambat daripada bagian lain dari proses jadi mengapa semua kekhawatiran tentang efek?

sebf
sumber

Jawaban:

21

Masalah yang Anda uraikan bukanlah masalah "khusus". Tidak ada yang terlalu lambat untuk mengubah efek pada GPU. Masalah dengan efek berubah, parameter efek (termasuk transformasi), tekstur, berbagai status render, dan hanya mengirim beberapa perintah undian, adalah bahwa hal itu mengharuskan batch lain harus dikirim ke GPU .

Batch terikat CPU dan Anda hanya mendapatkan beberapa ribu * per frame untuk digunakan.

Itu tergantung pada CPU dan pekerjaan apa yang Anda lakukan, tetapi katakanlah Anda mendapatkan sekitar 1000 batch per frame. Jika Anda merender satu objek per batch, Anda dapat menggambar sekitar 1000 objek di layar sebelum Anda menemukan masalah.

Jika Anda tiba-tiba menambahkan memetik, dan Anda harus merender semua objek Anda dua kali, maka Anda terbatas untuk hanya menggambar 500 objek.

(Jadi jika Anda hanya memiliki sejumlah kecil benda, maka jangan khawatir!)

Untuk mengurangi jumlah batch yang Anda gunakan, Anda pada dasarnya harus "pintar" tentang hal itu. Metode prototipikal untuk melakukan ini adalah dengan cerdik menggabungkan beberapa objek menjadi satu batch. Secara khusus, cari " instancing ". Mungkin Anda bisa menggunakan nomor instance untuk menetapkan warna unik untuk setiap objek dalam shader Anda.

Teknik lain, terutama yang cocok untuk memetik, adalah menyisihkan objek yang dirender dalam perangkat lunak sehingga Anda tidak merender apa pun yang Anda tahu tidak menyentuh piksel yang Anda pilih.

Berikut ini adalah seluruh slide presentasi dari NVidia berjudul "Batch, Batch, Batch: Apa Artinya Ini?" (PDF) yang memiliki grafik bagus dan hal-hal yang menjelaskan hal ini. Ini juga mencantumkan beberapa teknik untuk mengurangi jumlah batch Anda.

Andrew Russell
sumber
Sepakat! Terima kasih telah menjelaskan dan sarannya, apa yang saya baca lebih masuk akal sekarang. Terima kasih juga untuk presentasi NVidia, saya baru saja membacanya sekarang dan ini sangat membantu.
sebf
1
Tautan yang diperbarui ke makalah "Batch, Batch, Batch": ce.u-sys.org/Veranstaltungen/…
Marton
1
Terima kasih Marton, saya telah mengedit tautan baru ke dalam pos :)
Andrew Russell