Bagaimana saya bisa mengurangi dampak kinerja rendering tree?

24

Saya membuat jenis permainan dengan gaya poli rendah. Saya memiliki medan dengan air, dan saya ingin banyak pohon; Saya memiliki 10.000 pohon yang ditempatkan secara massal, saat ini. Setiap pohon terdiri tidak lebih dari 200 segitiga, sehingga tidak terlalu melelahkan.

Masalah utamanya adalah, ada danau, dan danau itu cukup besar. Anda tidak dapat benar-benar melihat pohon di seberang danau, dan itu terlihat sangat buruk, terutama ketika Anda berjalan di sana dan pohon tiba-tiba muncul.

Untuk memperbaikinya, saya harus meningkatkan jarak pohon sehingga Anda dapat melihat jumlah pohon yang layak di sisi lain danau, tetapi itu mengurangi kinerja menjadi 40-50fps, dan hampir tidak ada hal lain dalam permainan. Saya menggunakan GTX 1080, jika itu membantu.

Apa yang bisa saya lakukan untuk membuat game saya berjalan lebih cepat dengan lebih banyak pohon?

mr-matt
sumber
IIRC, Silent Hill menggunakan kabut untuk menyembunyikan cutoff di pesawat kliping jauh, yang memungkinkan mereka untuk mulai memuat barang secara dinamis tepat di luar tempat kabut terputus. Anda mungkin mendapat manfaat dari perubahan suasana permainan.
Cody
Pepohonan menarik Anda untuk melihat keluar jendela, sehingga menurunkan kinerja Anda.
mbomb007
Sudahkah Anda mencoba menjalankan profiler? Jika demikian, di mana kemacetannya?
Mikael Högström
Apakah Anda melakukan pemusnahan frustrasi?
Krythic
Apa itu pemusnahan frustum?
mr-matt

Jawaban:

43

Ada beberapa hal yang dapat Anda lakukan untuk meningkatkan kinerja menggambar.

  1. Anda mengatakan mereka cukup jauh. Anda dapat menggunakan LOD untuk mengurangi jumlah simpul pohon-pohon itu, dan dengan demikian mengurangi waktu yang diperlukan untuk melewati semua simpul yang ditarik. Meskipun ini kemungkinan besar bukan masalah yang dihadapi (GTX1080 dengan hanya 10k pohon dengan masing-masing 200 tris, angka kecil untuk GPU) saya masih memasukkannya. Billboarding adalah alat yang efektif untuk tingkat LOD terendah, karena pada dasarnya merupakan bidang datar yang selalu menghadap kamera dengan gambar pohon yang ada di atasnya. Itu kehilangan rasa mendalam, itulah sebabnya itu baik untuk level terendah karena pemain kemungkinan besar tidak akan melihat perbedaannya.

  2. Sudahkah Anda mengaktifkan batching ? Batch dinamis biasanya dilakukan secara otomatis jika jumlah vertex jerat cukup rendah. Penumpukan statis juga dapat dicoba dengan membuat pohon-pohon menjadi statis dengan mencentang kotak centang di editor kesatuan pada objek game induk. Ini tidak berfungsi dengan baik pada objek animasi. Anda membutuhkan objek yang telah dibagikan materi untuk membuatnya bekerja.

  3. Penumpukan khusus memungkinkan Anda mengontrol rendering dengan membuat potongan sendiri alih-alih membiarkan persatuan menanganinya, dan itu juga memungkinkan batching untuk jerat yang lebih besar. Ini dilakukan dengan mudah oleh Mesh.CombineMeshes . Ini juga tidak berfungsi dengan baik dengan objek animasi. Anda membutuhkan objek yang telah dibagikan materi untuk membuatnya bekerja. Anda mungkin ingin membagi dunia Anda ke beberapa jenis dan membuat batch dari itu. Bagaimana potongan-potongan itu harus dihasilkan benar-benar tergantung pada bagaimana kamera Anda bergerak di dunia.

  4. Aktifkan instance pada shader. Instancing memungkinkan engine untuk menggambar beberapa objek (dengan mesh yang sama) hanya dengan satu panggilan draw. Anda membutuhkan objek untuk berbagi mesh dan berbagi shader agar ini berfungsi. Materi dapat bervariasi, tetapi shader harus mendukung semua sifat yang berbeda.

    Untuk membuat mesin membuat batch rendering yang dipasang lebih baik, Anda mungkin ingin mengelompokkan jerat yang sama bersama-sama dalam adegan. Juga bermain dengan material membuat antrian akan memberi Anda hasil yang baik jika satu mesh selalu memiliki materi yang sama. Selama pengembangan game seluler yang sedang saya kerjakan, saya menggunakan ini untuk mengurangi drawcall lebih dari setengahnya di adegan pengujian saya. Juga karena Unity 5.6 pastikan Anda mencentang Enable Instancingkotak centang dalam materi.

  5. Jaga drawcall Anda dan panggilan SetPass secara umum. Ini adalah panggilan baku untuk GPU Anda untuk menggambar, dan mereka memiliki overhead yang besar. Mengurangi drawcall (yang dilakukan batching dan instancing) akan meningkatkan kinerja CPU Anda secara keseluruhan karena diharuskan untuk menunggu lebih lama. Panggilan SetPass adalah perubahan pada shader Anda saat ini, jadi jika Anda memiliki banyak materi berbeda, Anda akan memiliki beberapa panggilan SetPass, yang juga menyebabkan CPU menunggu sedikit.

  6. Jika adegan Anda sangat besar dan waktu CPU Anda masuk untuk menelusuri semua objek dalam adegan, cobalah untuk mengurangi objek dalam adegan. Kelompokkan beberapa pohon alih-alih menempatkannya secara invidual dan menjadikannya sebagai objek tunggal. Pastikan juga Anda tidak memindahkan pohon atau objek induk, karena itu membuat Unity untuk membuang transformasi yang di-cache dan untuk menghitung ulang seluruh pohon adegan.

  7. Jika adegan Anda sangat besar dan waktu CPU Anda masih sebagian besar masuk ke Unity berjalan melalui pohon adegan untuk membuat daftar untuk membuat semua objek, satu hal yang bisa Anda lakukan adalah tidak membiarkan Unity menangani rendering. Jika Anda memiliki cara yang lebih baik untuk melacak objek yang dapat digambar, Anda dapat menggunakan CommandBuffer.DrawMeshInstanced atau Graphics.DrawMeshInstanced untuk menggambarnya dengan tangan. Saya tidak akan menjelaskan lebih jauh tentang ini karena ini jauh lebih maju dan melibatkan pemusnahan diri sendiri dan yang lainnya.

Dalam hal jika batching statis atau dinamis tidak berfungsi dengan benar (yang dapat Anda lihat dengan memeriksa debugger frame), Anda perlu memastikan bahwa Anda memang menggunakan bahan bersama, dan tidak membuat salinan materi secara tidak sengaja dengan panggilan meshRenderer.material. Memanggil .materialakan membuat salinan materi Anda dan menghancurkan batching. Gunakan .sharedMaterialsebagai gantinya.

Karena Unity 5.6 Anda dapat menggunakan Frame Debugger untuk menentukan mengapa drawcall tertentu tidak batch dengan drawcall sebelumnya. Ini akan sangat membantu saat mencoba mengurangi drawcalls game Anda.

Instancing memiliki keunggulan berikut dibandingkan dengan batch statis / dinamis / custom:

  • Menggunakan lebih sedikit memori karena mesh tidak harus diduplikasi dalam memori
  • Dapat menggunakan banyak bahan, hanya shader yang dibagikan diperlukan
  • Objek dapat dianimasikan

Juga sebagai downside itu adalah fitur yang agak baru di Unity dan mungkin agak tidak stabil. GPU perangkat yang lebih lama atau seluler tidak selalu mendukung pemasangan.

Lasse
sumber
1. Ya, saya telah mencoba LOD, dan yang mengejutkan saya, ini malah membuatnya lebih buruk. Saya memiliki 3 variasi pohon masing-masing dengan jumlah simpul sedikit lebih rendah, dan satu bidang datar dengan gambar pohon yang diberikan di atasnya.
mr-matt
2. Semua pohon saya ditandai sebagai statis. Sejauh yang saya tahu itu memungkinkan batching? Apakah itu benar? Dan ketika Anda mengatakan materi yang dibagikan, apakah maksud Anda, pohon-pohon tersebut memiliki materi yang sama?
mr-matt
3. Peningkatan kinerja seperti apa yang sebenarnya dilakukan? Apakah pantas dicoba?
mr-matt
1
2/3: Dalam pengalaman saya, Unity tidak melakukan pekerjaan yang sangat baik di batching dinamis dan batching statis meningkatkan ukuran build, jadi saya mengimplementasikan batching sendiri dan melakukan mesh yang menggabungkan load-time. Dengan menggunakan teknik ini, saya berhasil membuat 2500 drawcalls untuk dikompres menjadi sekitar 300 drawcalls yang sangat penting untuk game seluler kami di mana drawcall penting. Itu membuat sedikit simpul yang tidak perlu untuk dihitung (offscreen) tapi itu layak.
Lasse
2
tfw ketika Anda membaca pertanyaan tentang kinerja yang buruk dengan pohon dan tidak ada satu kata pun tentang billboarding hilang
Num Lock
13

Ok, jadi masalahnya adalah saya tidak menggunakan GI waktu nyata yang sudah dihitung sebelumnya. Saya memeriksanya beberapa saat yang lalu tetapi tidak memiliki efek langsung jadi saya meninggalkannya dan melupakannya, dan waktu pemrosesan pencahayaan juga begitu lama. Namun, itu baru saja selesai memprosesnya, dan kata saya, fps saya telah melonjak 3x. Jadi untuk sekarang, saya akan berhenti di situ dan di masa depan pastikan saya selalu menggunakan GI realtime komputer!

Jika masih ada hal lain yang bisa saya lakukan untuk lebih meningkatkan kinerja, tolong beri tahu saya, saya akan sangat berterima kasih!

mr-matt
sumber
2
Gunakan Oklusi Culling, juga jika adegan Anda besar - pertimbangkan untuk membaginya dalam potongan, misalnya banyak medan dan muat dan bongkar.
Candid Moon _Max_
Mengingat bahwa Anda tampaknya telah menyelesaikan masalah Anda, Anda mungkin harus menerima jawaban ini.
Gnemlock