OK, saya mengerti bahwa gl_quads sudah usang, dan dengan demikian kita tidak 'seharusnya' menggunakannya lagi. Saya juga mengerti bahwa PC modern saat menjalankan game menggunakan gl_quads sebenarnya menggambar dua segitiga.
Sekarang, saya sudah mendengar karena itu permainan seharusnya ditulis menggunakan segitiga sebagai gantinya. Tapi saya bertanya-tanya apakah, karena secara spesifik bagaimana OpenGL membuat quad menjadi dua segitiga, apakah masih menguntungkan untuk menggunakan quads?
Secara khusus, saat ini saya sedang membuat banyak paha yang tidak terhubung dari objek buffer yang agak besar. Salah satu area yang harus saya perhatikan adalah seberapa besar vektor float yang saya gunakan untuk membuat / memperbarui objek buffer ini (saya punya beberapa nilai float tambahan per vertex, dan banyak simpul dalam buffer - the buffer terbesar sekitar 500KB).
Jadi saya tersadar bahwa jika saya mengubah objek buffer saya untuk menggambar segitiga data vertex ini akan menjadi 50% lebih besar (enam simpul untuk menggambar persegi daripada 4), dan membutuhkan waktu 50% lebih lama untuk CPU untuk menghasilkan.
Jika gl_quads masih berfungsi, apakah saya mendapatkan manfaat di sini, atau apakah 50% memori tambahan dan waktu CPU masih digunakan pada konversi otomatis OpenGL menjadi dua segitiga?
Jawaban:
Uji permainan Anda yang sebenarnya. Jika paha depan lebih cepat, gunakan itu. Jika tidak, jangan.
Seseorang dapat beralasan bahwa mereka lebih lambat dalam beberapa kasus karena beberapa perangkat keras tidak mendukung paha depan, sehingga pengemudi harus melakukan banyak pekerjaan untuk "memperbaiki" panggilan quad draw. Beberapa perangkat keras tidak mendukung paha depan, melakukan pemisahan hingga segitiga dalam beberapa langkah perakitan input fungsi-tetap, sehingga bekerja tanpa overhead yang signifikan. Ada juga pertanyaan tentang bagaimana paha depan diajukan diindeks vs non-diindeks, saat Anda menaikkannya, dan yang membuat penggunaan bandwidth transfer bus dan waktu pembuatan CPU yang lebih baik menjadi lebih baik. Kebijaksanaan rakyat mengatakan untuk menghindari paha depan, yang merupakan nasihat yang baik jika Anda mulai dari nol, mungkin tidak terlalu banyak jika kode Anda sudah berfungsi. kebijaksanaan rakyat mengatakan bahwa banyak hal membunuh kinerja meskipun permainan nyata dan berkinerja baik melakukan hal-hal itu.
Singkatnya, tes. Jangan berasumsi, dan jangan meminta saran kinerja dari Internet. Kami mungkin benar kadang-kadang tetapi lebih sering kami akan memberi Anda data yang sudah ketinggalan zaman, data berdasarkan beberapa keadaan tertentu yang tidak Anda hadapi, atau benar-benar sampah yang kami peroleh sendiri dari Internet atau kolega (yang sendiri mungkin tidak memiliki pengalaman langsung).
sumber
Apa alternatifnya? Nah, salah satu alternatif adalah menggunakan Geometry Shaders , melewatkan
GL_LINES_ADJACENCY
primitif (4 simpul) dan meminta GS mengubah primitif ini menjadi strip segitiga. Namun, itu akan menjadi lebih lambat untuk di-render, karena kita harus mengasumsikan geometri shader selalu lebih lambat untuk di-render.Metode yang lebih baik adalah dengan menggunakan rendering yang diindeks. Di sini, Anda memiliki dua alternatif:
GL_TRIANGLES
danGL_TRIANGLE_STRIP
dengan memulai ulang primitif. Yang terakhir akan menghasilkan buffer indeks yang sedikit lebih pendek (satu indeks untuk setiap quad). Anda dapat menggunakan kembali buffer indeks yang sama untuk rendering quad apa pun, sehingga Anda tidak perlu memperbarui atau memodifikasi buffer indeks.Saya juga menyarankan menggunakan celana pendek tanpa tanda tangan sebagai tipe indeks. Jika Anda perlu membuat lebih dari 16384 quads sekaligus, maka buat beberapa panggilan rendering, menggunakan glDrawElementsBaseVertex untuk mengimbangi indeks.
sumber
glMultiDrawArraysIndirect
melakukannya dari sisi GPU. Yang dapat Anda lakukan, tetapi membatasi perangkat keras.