Cara paling berkinerja untuk mengatur data vertex pada GPU modern

9

Katakanlah saya memiliki model terdiri dari simpul, masing-masing dengan position, normal, tangent, dan texcoordatribut, di mana segitiga ditentukan oleh tiga kali lipat indeks.

Jika kita hanya fokus pada atribut vertex, saya menyadari dua strategi luas: struktur array, dan array struktur. Saya juga pernah mendengar bahwa susunan struktur lebih disukai karena meningkatkan lokalitas memori (dan karenanya cache lokalitas) dari atribut untuk vertex yang diberikan.

Benarkah ini meningkatkan kinerja? Cara utama saya bisa berpikir bahwa ini akan terjadi adalah dengan indeks titik yang memerlukan rasterizer untuk memperoleh data titik yang sudah lama diusir dari cache. Jika akses data titik adalah acak seperti ini, maka menjaga semua atribut untuk titik pada baris cache yang sama pasti akan membuat segalanya lebih cepat, tetapi bukankah ini masalah yang sebagian besar dapat dikurangi dengan mengoptimalkan urutan spesifikasi segitiga?

Lebih jauh, ini adalah pemahaman saya bahwa GPU modern mungkin lebih baik dalam membongkar vektor panjang dari jenis yang sama, daripada vektor struktur dari banyak jenis. Apakah kemudian mungkin untuk tata letak array struktur untuk secara konsisten mengungguli tata letak array struktur data vertex yang sama, jika urutan indeks dioptimalkan?

lcmylin
sumber
4
Tidak bisakah Anda mencobanya dan melihat mana yang tercepat untuk kasus Anda?
user1118321
Saya akan berpikir untuk jerat yang diindeks bahwa susunan struktur akan lebih efisien karena vertex shader akan diumpankan semua atribut titik sehingga setelah mereka dikelompokkan bersama dalam memori akan menjadi cache lebih ramah.
PaulHK
Tergantung pada tipe data dalam struktur, vec4s dan float paket bersama-sama dengan baik, tipe lain tidak begitu baik
PaulHK
2
@ user1118321 Sementara percobaan pembandingan individu adalah praktik yang patut dipuji, tentu ada nilai lebih jangka panjang dalam diskusi teoretis yang lebih luas dan mungkin menghasilkan praktik umum yang didasarkan pada cara kerja perangkat keras penarik titik.
Chris berkata Reinstate Monica

Jawaban:

2

Maaf, saya akan menambahkan komentar ke utas pertanyaan Anda tetapi ternyata saya terlalu banyak menguraikan. Pengalaman pengembangan saya berasal dari perspektif DX 11 sehingga beberapa di antaranya mungkin tidak berlaku di OpenGL

Lokasi memori data tentu saja memainkan peran utama. Tetapi ada beberapa item lain yang bisa memainkan ini, lebar data seperti yang Anda tahu. Saya telah memiliki beberapa GPU dan memiliki kinerja yang luar biasa berdasarkan beberapa titik kritis tertentu. Itu adalah contohnya, pada AMD r290 lama saya jika saya ingat, Anda pada dasarnya bisa melewatkan hingga 4 float4s melalui buffer vertex tanpa biaya tambahan lebih dari 1, tetapi begitu saya memposting> 4 maka ada penurunan yang terukur (dalam bingkai) menilai). Ini murni dari ingatan saya dan jadi anekdot sebagai yang terbaik. Tetapi ia berpendapat bahwa arsitektur GPU berubah sepanjang waktu, dan teknik niche apa yang memberi Anda keunggulan kinerja hari ini mungkin menjadi kutukan bagi kinerja Anda besok. SAYA'

Karena itu, Anda telah mengajukan pertanyaan tentang pemesanan simpul, dan tentu saja itu akan membantu sedikit. Keuntungan kinerja adalah ketika Anda menggabungkan ini dengan buffer indeks yang kemudian memungkinkan perangkat keras untuk mengoptimalkan dan cache simpul yang sudah dihitung. Anda tentu bisa mendapatkan lebih banyak keuntungan dari strip Segitiga dll yang dipesan khusus sesuai pikiran Anda. Sebagian besar model rendering yang saya lakukan adalah model dioptimalkan berbasis indice / vertex dengan instancing, saya menggunakan sedikit pencarian untuk efek gerakan siklik (cabang pohon misalnya), dalam kasus ini seluruh cabang pohon mencari nilai yang sama. Jadi caching dapat dimanfaatkan di sini juga.

Yang bisa saya katakan dalam ringkasan dari diri saya adalah:

  • Cobalah untuk tidak terlalu memikirkan optimasi di awal, sementara Anda masih mengembangkan game / aplikasi Anda mencoba untuk tidak mengoptimalkan secara prematur. Jika Anda perlu kembali dan menambahkan kemampuan baru, Anda mungkin kehilangan semua upaya. Anda memiliki kebiasaan saya mungkin> <, senang mencoba mendapatkan kinerja dan teknik terbaik
  • Arsitektur GPU bervariasi, dan kekuatan satu dapat mencerminkan kelemahan yang lain. AMD dan Nvidia terkenal untuk mendapatkan pengembang untuk mengoptimalkan game ke arsitektur mereka, karena suatu alasan, masing-masing memiliki kelebihan / kekurangan. Mengambil jalan tengah pada pengembangan mungkin tempat terbaik, jangan gunakan fitur berbasis vendor perangkat keras (pendapat di sini). (Tambahkan ke itu, beberapa format dikemas hanya ada di AMD).

Ini hanya beberapa pemikiran dan pengalaman yang saya miliki. Ada banyak buku di luar sana yang harus Anda tangani di sekitar topik-topik ini. Saya tidak melihat banyak resep apa yang Anda usulkan, tetapi itu tidak berarti itu salah. Semoga berhasil.

ErnieDingo
sumber
1

Ini mungkin tergantung pada perangkat keras target dan API yang akan Anda gunakan. Bisakah Anda memberikan info lebih lanjut? Inilah beberapa praktik terbaik (sangat luas dan umum) untuk OpenGL. https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices

Juga, apakah Anda memiliki masalah kinerja? Atau apakah Anda hanya ingin tahu.

saya mengerikan
sumber