pengantar
Saat kami membuat game, kami sering mengabaikan salah satu aspek terpenting dalam pengembangan game - pengoptimalan. Akibatnya, kami mendapatkan kelambatan dan FPS rendah (terkadang bahkan pada perangkat kelas atas, jika semuanya benar-benar berjalan). Kebanyakan orang akan selalu melihat pengoptimalan game sebagai langkah terakhir, dan ini adalah kesalahan pertama - ini harus selalu menjadi item pertama dalam daftar.
Tidak mungkin melebih-lebihkan kebiasaan pada setiap build, setiap hari saat Anda menambahkan mekanik baru atau pengaturan pencahayaan baru, atau sistem berbasis fisika apa pun ke game Anda, selalu periksa build untuk melihat apakah ada masalah performa karena ini perubahan adalah praktik pengembangan game yang baik.
Jika Anda tidak meluangkan waktu untuk mengoptimalkan performa sejak awal proyek, hal itu dapat menimbulkan masalah bagi Anda dan game Anda di tahap akhir. Di sini saya ingin berbagi beberapa pemikiran dan tip tentang bagaimana Anda dapat meningkatkan kinerja game Anda berdasarkan beberapa pelajaran praktis yang saya pelajari dari kesalahan saya selama 5 tahun terakhir.
Profil game Anda
Profiler adalah yang pertama dalam daftar dan salah satu alat favorit saya sepanjang masa di Unity untuk memantau kinerja game guna melihat apa yang sebenarnya menyebabkan masalah kinerja. Ini sangat berguna untuk mendapatkan pemahaman mendetail tentang bagaimana game Anda bereaksi terhadap berbagai perubahan di editor.
Anda dapat menemukan Profiler di Window-> Analysis-> Profiler
Ini menampilkan kategori seperti penggunaan CPU dan GPU, rendering, fisika, audio, dan banyak lagi. Kami tidak dapat mengandalkan pembuatan profil di Editor (Profil Editor), karena editor memengaruhi kinerja proyek selama pengujian, dan ini dapat memengaruhi validitas informasi pembuatan profil. Untuk mendapatkan data pembuatan profil yang akurat, lebih baik buat build terpisah.
Pembuatan profil jarak jauh
Untuk membuatnya berfungsi, Anda perlu menginstal Android SDK dan menghubungkan JDK dan debugging USB. Ingat, selalu merupakan ide yang baik untuk menguji bagaimana performa game Anda dalam hal mekanik, penskalaan UI, dan sebagainya. Belum lagi menguji performa dalam game di dunia nyata bersama dengan hal di atas. Untuk menguji performa sebenarnya dari game tersebut, Anda perlu membuat build profil kustom.
Untuk menghubungkan Remote Profiler, buka Edit> Project Settings> Editor dan di bagian Device pilih Any Android Device.
Pembuatan profil
Untuk memastikan bahwa Unity memiliki akses ke build Anda yang dapat dibuat profilnya, Anda harus mengaktifkan "Development build atau Deep Profiling Support" dan "Auto-connect Profiler" di setelan build sebelum membuatnya. Ini memungkinkan editor Unity menautkan build Anda secara otomatis.
Saat tawaran Anda siap, buka game Anda tanpa menutup jendela Unity Profiler. Unity sekarang akan otomatis menampilkan data performa untuk build game saat ini di jendela profiler.
Anda dapat mengetahui lebih lanjut tentang profiler di sini .
Batching GameObjects
Batching adalah teknik yang sangat baik untuk meningkatkan kinerja dengan mengurangi jumlah panggilan Draw, yang mengelompokkan rendering beberapa GameObject serupa dalam satu panggilan draw. Ada dua jenis metode batching: statis dan dinamis. Ada beberapa batasan untuk pengelompokan - kami tidak dapat melakukan proses batch untuk mesh berkulit, kain, dan beberapa komponen render.
Batching statis
Batching Statis digunakan setiap kali GameObjects statis. GameObject statis tersebut tidak boleh bergerak, menskalakan, atau memutar, dan harus menggunakan materi yang sama untuk semua GameObject statis agar batching berfungsi.
Jika GameObjects Anda tidak berinteraksi dengan Player Anda, atau jika Anda tidak mengubah Transform, maka yang terbaik adalah menggunakan batching statis untuk sebagian besar lingkungan dalam game Anda, seperti gedung, jalan, dll.
Pengelompokan dinamis
Dynamic Batching mirip dengan statis karena GameObject harus menggunakan bahan yang sama, tetapi dapat mengelompokkan objek bergerak tanpa harus membuatnya statis. Pada dasarnya, Unity dapat secara otomatis memuat GameObjects ke dalam draw call yang sama jika mereka menggunakan material yang sama, tetapi mereka memiliki beberapa batasan batching dinamis yang diberlakukan pada mereka sesuai dengan Unity:
- GameObjects dinamis batching memiliki overhead tertentu per vertex, jadi batching hanya diterapkan ke mesh dengan tidak lebih dari 300 vertex dan tidak lebih dari 900 atribut vertex.
- Shader Vertex Position, Normal UV, 300 , Shader Vertex Position, Normal, UV0, UV1 Tangent, 180 .
- : .
- GameObject- , transform (, GameObject A +1 GameObject B –1 ).
- Material , GameObject- , . Shadow Caster.
- : / . , GameObject- .
- Multi-pass .
- Unity , . « » .
- Legacy Deferred ( ) , GameObject .
Pengelompokan dinamis bekerja secara berbeda untuk sistem partikel, garis rendering, dan rendering jejak daripada untuk mesh.
- Untuk setiap jenis perender yang kompatibel, Unity mengumpulkan semua konten batch ke dalam 1 Buffer Vertex besar.
- Penyaji menyetel status bahan batch.
- Unity mengikat Buffer Vertex ke Perangkat Grafik.
- Untuk setiap penyaji dalam kelompok, Unity memperbarui offset di Vertex Buffer dan kemudian mengirim panggilan gambar baru.
Ada cara lain untuk meningkatkan batching menggunakan beberapa aset dari Assetstore seperti Simple Mesh Combine, Bakery, atau bisa juga kita gunakan
Mesh.CombineMeshesuntuk menggabungkan beberapa mesh menjadi satu, yang sangat ideal untuk mengoptimalkan performa.
Panggang pencahayaan Anda
Secara kasar, ada tiga mode pencahayaan: Realtime, Baked dan Mixed.
Waktu nyata adalah yang terbaik TAPI Anda harus membayarnya dengan kinerja. Ini membawa cahaya langsung ke tempat kejadian dan memperbarui setiap bingkai saat lampu dan objek permainan bergerak di dalam pemandangan, memperbarui pencahayaan dengan segera.
Kapan pun Anda memiliki opsi untuk memanggang pencahayaan di atas panggung, pastikan untuk menggunakannya karena ini ideal untuk peningkatan produktivitas, terutama jika Anda menargetkan perangkat seluler. Sebaiknya gunakan pencahayaan rendah di atas panggung untuk mendapatkan tampilan yang diinginkan.
Dengan cara ini, semua lampu Anda akan dihitung sebelumnya secara offline dalam proses yang disebut Lightmap Baking. Saat Anda menyetel GameObject Lightmap Static Flag, Unity membuat informasi tentang GameObject Light, bayangan, cahaya specular, dan bayangan lembut dalam tekstur yang menyentuh pemandangan Anda. Namun, Lightmaps memiliki beberapa batasan, pencahayaan tidak dapat diperbarui secara dinamis untuk objek yang Anda pilih dengan Lightmap Static Flag.
Beberapa bulan yang lalu di waktu senggang saya membuat pemandangan SCIFI dan menurut saya ini adalah contoh terbaik tentang cara kerja pencahayaan yang dipanggang. Tentu saja saya menggunakan Emisi.
Jika ada yang tertarik dengan gambaran umum tentang bagaimana adegan SCIFI ini dibuat dan bagaimana saya mendapatkan tampilan ini, beri tahu saya, mungkin saya bisa mencurahkan artikel terpisah untuk ini.
, !
Ini adalah cara yang sangat bagus untuk meningkatkan performa game Anda dengan oklusi Unity. Secara umum, Pemusnahan Oklusi berarti bahwa Unity tidak akan menampilkan GameObject yang benar-benar tersembunyi dari perspektif kamera (tertutup) oleh GameObject lain.
Untuk membuka jendela Oklusi, buka Window-> Rendering-> Pemusnahan Oklusi
Jika ada yang tertarik dengan cara saya mendapatkan tampilan ini di adegan Hutan Misteri, beri tahu saya, mungkin saya bisa menulis artikel terpisah tentangnya.
Berikut videonya jika Anda tertarik!
twitter.com/i/status/1096336962259021824
Secara default, Unity menerapkan Frustum Culling, yang artinya hanya menampilkan garis pandang kamera, menampilkan semua objek. Misalnya, jika kamera melihat ke dinding, semua objek di belakang dinding itu juga akan ditampilkan. Kami tidak membutuhkan ini sama sekali, jadi kami perlu menambahkan Occlusion Culling ke adegan kami.
Inilah mengapa kita harus menggunakan Occlusion Culling, yang berarti kamera hanya akan merender dinding tanpa objek di belakangnya.
Baca lebih banyak: