Menganalisis format vertex

Anda dapat mendiagnosis beberapa kemungkinan masalah performa terkait vertex melalui penggunaan pembuatan profil frame. Gunakan panel Commands untuk melihat semua panggilan gambar yang dilakukan game Anda dalam frame tertentu dan jumlah primitif yang digambar per panggilan gambar. Ini dapat memberikan perkiraan jumlah keseluruhan verteks yang dikirimkan dalam satu frame.

Tampilan pembuatan profil frame untuk panggilan glDrawElements, yang diarahkan untuk melihat detail
            parameter panggilan gambar
Gambar 1. Tampilan pembuatan profil frame untuk satu panggilan glDrawElements, yang menampilkan 2.718 primitif segitiga yang digambar

Kompresi atribut vertex

Salah satu masalah umum yang mungkin dihadapi game Anda adalah ukuran verteks rata-rata yang besar. Sejumlah besar verteks yang dikirimkan dengan ukuran verteks rata-rata yang tinggi menghasilkan bandwidth pembacaan memori verteks yang besar saat dibaca oleh GPU.

Untuk mengamati format verteks untuk panggilan gambar tertentu, selesaikan langkah-langkah berikut:

  1. Pilih panggilan gambar yang diinginkan.

    Ini dapat berupa panggilan gambar standar untuk scene, panggilan gambar dengan sejumlah besar verteks, panggilan gambar untuk model karakter kompleks, atau jenis panggilan gambar lainnya.

  2. Buka panel Pipeline, lalu klik IA untuk assembly input. Ini menentukan format verteks untuk verteks yang masuk ke GPU.

  3. Amati serangkaian atribut dan formatnya; misalnya, R32G32B32_SFLOAT adalah float bertanda 32-bit 3 komponen.

Tampilan pembuatan profil frame untuk assembly input panggilan gambar, dengan
            atribut verteks yang tidak dikompresi
Gambar 2. Assembly input untuk panggilan gambar, dengan atribut yang tidak dikompresi menghasilkan ukuran verteks 56 byte

Sering kali, atribut verteks dapat dikompresi dengan pengurangan minimal pada kualitas model yang digambar. Secara khusus, kami merekomendasikan:

  • Mengompresi posisi vertex ke float 16-bit presisi setengah
  • Mengompresi koordinat tekstur UV ke ushorts bilangan bulat tanpa tanda tangan 16-bit
  • Mengompresi ruang tangen dengan mengenkode vektor normal, tangen, dan binormal menggunakan tanda empat

Atribut lain-lain juga dapat dipertimbangkan untuk jenis presisi lebih rendah berdasarkan kasus per kasus.

Pemisahan aliran vertex

Anda juga dapat menyelidiki apakah aliran atribut verteks telah dipisahkan dengan tepat. Pada arsitektur rendering bersusun seperti GPU seluler, posisi verteks pertama kali digunakan di tahap pengelompokan untuk membuat kumpulan primitif yang diproses di setiap kartu. Jika atribut verteks disisipi menjadi buffer tunggal, semua data verteks akan dibaca ke dalam cache untuk pengelompokan, meskipun hanya posisi verteks yang digunakan.

Untuk mengurangi bandwidth memori pembacaan verteks dan meningkatkan efisiensi cache, serta mengurangi waktu yang dihabiskan pada tahap pengelompokan, data verteks harus dibagi menjadi dua aliran terpisah, satu untuk posisi verteks, dan satu untuk semua atribut verteks lainnya.

Untuk menyelidiki apakah atribut verteks telah dipisahkan dengan tepat:

  1. Pilih panggilan gambar yang diinginkan, dan catat nomor panggilan gambar tersebut.

    Ini dapat berupa panggilan gambar standar untuk scene, panggilan gambar dengan sejumlah besar verteks, panggilan gambar untuk model karakter kompleks, atau jenis panggilan gambar lainnya.

  2. Buka panel Pipeline, lalu klik IA untuk assembly input. Tindakan ini menentukan format verteks untuk verteks yang masuk ke GPU.

  3. Amati binding atribut verteks Anda; biasanya ini mungkin meningkat secara linear (0, 1, 2, 3, dll.), tetapi tidak selalu demikian. Posisi verteks biasanya adalah atribut verteks pertama yang tercantum.

  4. Di panel State, temukan LastDrawInfos dan luaskan nomor panggilan gambar yang cocok. Lalu, luaskan BoundVertexBuffers untuk panggilan gambar ini.

  5. Amati buffer vertex yang terikat selama panggilan gambar yang diberikan, dengan indeks yang cocok dengan binding atribut vertex dari sebelumnya.

  6. Perluas binding untuk atribut verteks panggilan gambar Anda, dan perluas buffer.

  7. Amati VulkanHandle untuk buffer, yang mewakili memori dasar yang menjadi sumber data vertex. Jika VulkanHandle berbeda, ini berarti atribut berasal dari buffer dasar yang berbeda. Jika VulkanHandle sama, tetapi offsetnya besar (misalnya, lebih besar dari 100), atribut mungkin masih berasal dari sub-buffer yang berbeda, tetapi hal ini memerlukan penyelidikan lebih lanjut.

Tampilan pembuatan profil frame untuk assembly input panggilan gambar dan status yang menampilkan buffering vertex terikat
Gambar 3. Perakitan input untuk panggilan gambar, dengan panel status di sebelah kanan menunjukkan bahwa atribut pada binding 0 dan 1, posisi verteks dan normal, berbagi satu buffer yang mendasarinya

Untuk detail selengkapnya tentang pemisahan aliran verteks dan cara menyelesaikannya di berbagai mesin game, lihat postingan blog kami mengenai subjek tersebut.