Anggaran model 3D. Yang penting lebih banyak jumlah segitiga atau simpul

12

Ketika saya membuat model untuk permainan 3D, apa yang harus saya ambil sebagai ukuran dalam Poligon (segitiga) atau simpul anggaran saya? Saya telah melakukan percobaan dengan dua set 40000 kubus satu dengan 8 simpul dan 12 segitiga, yang lain dengan 24 simpul dan 12 segitiga. Semua dilakukan di Unity dan keduanya dihasilkan secara prosedural. Yang mengejutkan saya, kedua set tampil hampir sama ada perbedaan yang sangat kecil di antara mereka.

Apakah itu berarti saya tidak perlu khawatir tentang jumlah simpul dan hanya melihat jumlah segitiga?

EDIT: Saya telah membuat percobaan lain. Saya telah membuat sebuah pesawat dengan 19602 segitiga dan 10.000 simpul dan satu lagi dengan jumlah tirangles yang sama tetapi 39204 simpul. Saya telah menghasilkan 4000 dari keduanya. Sekarang lebih sedikit simpul yang memenangkan 14 fps hingga 19 fps. Jadi saya kira umumnya lebih sedikit lebih baik, tetapi hanya dalam perbedaan besar.

Michał Leszczyński
sumber
9
Tulis game Anda dan perbaiki masalah yang muncul. Masalah seperti ini mungkin tidak pernah muncul dan Anda membuang-buang waktu: P
Vaillancourt

Jawaban:

16

Mari kita bayangkan mesh grid besar, seperti yang mungkin kita gunakan untuk medan. Kami akan membuat nsegitiga itu layak, meliputi katakanlah setengah layar 1080p kami, dalam satu panggilan undian.

Jika kita mengelas semua simpul kita dan tidak memiliki lapisan penghalusan / tekstur, maka setiap segitiga memiliki 3 simpul dan masing-masing simpul dibagi oleh 6 segitiga, jadi kita memiliki n/2simpul.

Untuk membuat ini kita perlu:

  • Jalankan vertex shader setidaknya n/2kali

    ("setidaknya" karena cache kita untuk hasil vertex hanya begitu besar. Kadang-kadang kita akan berakhir mengusir sebuah vertex yang sudah kita ubah, lalu membutuhkannya lagi untuk segitiga selanjutnya yang membagikannya dan menjalankan kembali vertex shader di atasnya. Jadi, kita tidak mendapatkan penghematan sebanyak yang terlihat di atas kertas)

  • Klip & cull nsegitiga.

  • Rasterisasi & interpolasi setidaknya 1920x1080 / 2 atau sekitar 1 juta piksel dari penyangga bingkai (karena kami mengatakan bahwa wilayah kami mencakup sekitar setengah layar).

    ("setidaknya" karena cara GPU bekerja pada quads piksel , beberapa fragmen di luar tepi poligon masih dirasterisasi tetapi kemudian ditutup, artinya kami memproses fragmen dua kali. Untuk mesh bergelombang kami juga akan mendapatkan overdraw di mana saja mesh) menutup sendiri, jika kita tidak cukup beruntung untuk menarik poligon paling depan ke dalam buffer kedalaman terlebih dahulu)

  • Jalankan shader fragmen untuk semua itu> = 1 juta fragmen.

  • Blend ~ 1 juta hasil ke dalam bingkai & kedalaman buffer.

Oke, sekarang mari kita lepaskan semua simpul kita jadi sekarang kita punya 3nsimpul untuk dirender, enam kali lebih banyak dari sebelumnya! Langkah kami adalah ...

  • Jalankan vertex shader 3nkali.

    (Tidak ada tanda bintang karena caching karena setiap titik hanya digunakan satu kali, meskipun ini berarti cache tidak dapat menghemat waktu kita)

  • Klip & cull nsegitiga.

  • Rasterisasi & interpolasi setidaknya 1920x1080 / 2 atau sekitar 1 juta piksel buffer bingkai.

  • Jalankan shader fragmen untuk semua itu> = 1 juta fragmen.

  • Blend ~ 1 juta hasil ke dalam bingkai & kedalaman buffer.

... tunggu, setiap langkah kecuali yang pertama adalah sama! Jadi sebagian besar pekerjaan yang dilakukan GPU pada panggilan biasa tidak berhubungan langsung dengan jumlah simpul yang digunakan. Jumlah cakupan layar, penarikan berlebih, dan jumlah total segitiga merupakan biaya yang jauh lebih besar.

Itu tidak berarti simpul sepenuhnya gratis. Jika Anda berbagi titik ketika Anda bisa mendapatkan sedikit penghematan dari caching, terutama jika titik sudut Anda rumit atau pipa titik perangkat keras Anda lemah (seperti halnya pada beberapa konsol lama). Tetapi mengingat bahwa jumlah titik verteks sebanding dengan jumlah segitiga plus atau minus faktor konstan, biasanya tidak menarik metrik biaya mesh keseluruhan.

DMGregory
sumber
Bagaimana dengan biaya pengiriman simpul ke memori?
Michał Leszczyński
7
Kecuali Anda mengubah buffer vertex Anda setiap frame, Anda membayar biaya unggah itu satu kali. Tekstur dan penyangga bingkai Anda cenderung lebih besar dari memori video dan bandwidth dalam bingkai tertentu. Itu masih berarti simpul tentu saja tidak gratis, dan lebih baik membaginya saat praktis, tetapi simpul yang tidak dibagi jarang akan menjadi alasan mengapa permainan berperforma buruk.
DMGregory
Akan menambah ini, karena saya melakukan hutan dll dalam permainan saya. Ketika saya mulai, saya awalnya menggunakan draw draw (saya menggunakan mesin saya sendiri, ini mungkin tidak sepenuhnya selaras dengan pertanyaan Anda) untuk menggambar model dengan verts saja, ini dengan sendirinya ok, kinerja baik-baik saja. Tetapi, ketika saya mulai menggunakan pengindeksan, saya mendapatkan peningkatan kinerja karena beberapa verts dibagikan dan di-cache, sehingga beberapa perhitungan tidak dilakukan dua kali. Apa intinya adalah, bahwa tes mentah dari verts saja bukan yang terbaik indikator vs jumlah tri. Saluran pipa Anda dapat dipengaruhi oleh terlalu banyak. Sebagai jawaban lain menyinggung.
ErnieDingo
2

Tidak juga.

Kecuali Anda berbicara jumlah tris (jutaan) yang sangat besar, yang Anda pedulikan adalah:

  • Jumlah piksel yang diberikan
  • Biaya fragmen shader
  • Jumlah panggilan undian (dengan batas sangat tergantung pada perangkat).

24 simpul kali 4000 kubus memberikan 96'000 simpul.

640x380 piksel memberikan fragmen 243'200, dan sebagian besar perangkat mendukung resolusi yang jauh lebih besar.

Anda dapat menjalankan kembali percobaan dengan 1'000'000 kubus, ditumpuk untuk menghindari hambatan panggilan undian (1 model tunggal untuk 1'000 kubus).

Peter
sumber
2
Ini sangat tergantung pada adegan dan bagaimana Anda rendering. Jika Anda memiliki adegan yang secara alami memiliki sedikit overdraw, pemrosesan vertex tentu dapat mendominasi kinerja Anda. Juga, jumlah panggilan draw bukan masalah (untuk beberapa API) sebanyak perubahan keadaan antara panggilan draw.
Nicol Bolas
1

Perlu dicatat bahwa jika Anda melakukan aplikasi WebGL, jumlah vertex dengan cepat menjadi hambatan dalam hal ukuran file untuk diunduh pengguna. Jumlah segitiga yang sama tetapi sering simpul 2-3 kali lebih banyak daripada yang ditunjukkan dalam perangkat lunak DCC. Membuka bungkus yang lebih baik dapat banyak membantu dalam hal ini dengan memiliki sedikit jahitan.

Francisco Toledo
sumber