Katakanlah saya memiliki model terdiri dari simpul, masing-masing dengan position
, normal
, tangent
, dan texcoord
atribut, 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?
sumber
Jawaban:
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:
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.
sumber
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.
sumber