Banyak masalah yang ditemukan dalam proyek-proyek nyata terjadi karena kesalahan jujur - perubahan "test" sementara dan kesalahpahaman oleh pengembang yang lelah dapat secara diam-diam menambahkan aset berkinerja buruk, atau mengubah pengaturan impor aset yang ada.
Untuk setiap proyek skala signifikan, yang terbaik adalah memiliki garis pertahanan pertama terhadap kesalahan manusia. Hal ini relatif sederhana untuk menulis sejumlah kecil kode yang memastikan bahwa tidak ada yang dapat menambahkan Tekstur yang tidak terkompresi 4K ke proyek.
Dan, ini adalah masalah yang mengejutkan umum. Sebuah 4K uncompressed Tekstur menempati 60 megabyte memori. Pada perangkat seluler low-end, seperti iPhone 4S, itu berbahaya untuk mengkonsumsi lebih dari sekitar 180-200 megabyte memori. Jika ditambahkan oleh kesalahan, Tekstur ini sengaja menempati antara ketiga dan seperempat dari anggaran memori aplikasi, dan menyebabkan kesalahan out-of-memory yang sulit didiagnosis.
Meskipun sekarang dimungkinkan untuk melacak isu-isu ini turun dengan 5.3 Memory ProfilerJendela yang membantu Anda untuk mengoptimalkan permainan Anda. Ini menunjukkan berapa banyak waktu yang dihabiskan di berbagai bidang permainan Anda. Sebagai contoh, dapat melaporkan persentase waktu yang dihabiskan rendering, aimating, atau dalam logika permainan Anda. More info
Lihat di Glossary, sangat baik untuk memastikan kesalahan tersebut tidak mungkin di tempat pertama.
Kelas AssetPostprocessor
di Editor Unity dapat digunakan untuk menegakkan standar minimum tertentu pada proyek Unity. Kelas ini menerima callback ketika Aset diimpor. Untuk menggunakannya, warisan dari AssetPostprocessor
dan menerapkan satu atau lebih metode OnPreprocess
. Yang signifikan termasuk:
OnPreprocessTexture
OnPreprocessModel
OnPreprocessAnimation
OnPreprocessAudio
Lihat Referensi Scripting pada AssetPostprocessor untuk lebih mungkin metode OnPreprocess
.
public class ReadOnlyModelPostprocessor : AssetPostprocessor {
public void OnPreprocessModel() {
ModelImporter modelImporter =
(ModelImporter)assetImporter;
if(modelImporter.isReadable) {
modelImporter.isReadable = false;
modelImporter.SaveAndReimport();
}
}
}
Ini adalah contoh sederhana dari aturan pengatur AssetPostprocessor
pada sebuah proyek:
Kelas ini disebut setiap saat model diimpor ke proyek, atau ketika model memiliki pengaturan impornya berubah. Kode hanya memeriksa untuk melihat apakah bendera Read/Write enabled
(diwakili oleh properti isReadable
) diatur ke true
. Jika itu, itu memaksa bendera menjadi false
dan kemudian menyimpan dan mengekspor Aset.
Perhatikan bahwa memanggil SaveAndReimport
menyebabkan cuplikan kode ini akan dipanggil lagi! Namun, karena sekarang dijamin bahwa isReadable
palsu, kode ini tidak menghasilkan loop reimport tak terbatas.
Alasan perubahan ini dibahas di bagian "Model", di bawah ini.
Disable the read/write enabled flag
Bendera Read/Write enabled
menyebabkan Tekstur untuk disimpan dua kali dalam memori: sekali di GPU dan sekali dalam memori yang dapat dipesan CPU(1) (NOTE: Ini karena, pada sebagian besar platform, membaca dari memori GPU sangat lambat. Membaca Tekstur dari memori GPU menjadi penyangga sementara untuk digunakan oleh kode CPU (misalnya Tekstur. GetPixel Dalam Unity, pengaturan ini dinonaktifkan secara default, tetapi dapat dialihkan secara tidak sengaja.
Read/Write Enabled
hanya diperlukan ketika memanipulasi data Tekstur di luar ShadersProgram yang berjalan di GPU. More info
Lihat di Glossary (seperti dengan API Texture.GetPixel
dan Texture.SetPixel
) dan harus dihindari setiap kali mungkin.
Disable Mipmaps if possible
Untuk objek yang memiliki relatif variant Z-depth relatif terhadap CameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
Lihat di Glossary, dimungkinkan untuk menonaktifkan mipmaps untuk menyimpan tentang ketiga memori yang diperlukan untuk memuat Tekstur. Jika objek berubah Z-depth, menonaktifkan mipmap dapat menyebabkan kinerja pengambilan tekstur yang lebih buruk pada GPU.
Secara umum, ini berguna untuk Tekstur UI(User Interface) Memungkinkan pengguna untuk berinteraksi dengan aplikasi Anda. Unity saat ini mendukung tiga sistem UI. More info
Lihat di Glossary dan Tekstur lain yang ditampilkan pada ukuran konstan di layar.
Compress all Textures
Menggunakan format compressionMetode menyimpan data yang mengurangi jumlah ruang penyimpanan yang dibutuhkan. Kompresi Tekstur, Kompresi Animasi, Kompresi Audio, Membangun Kompresi.
Lihat di Glossary tekstur yang cocok untuk platform target proyek sangat penting untuk menghemat memori.
Jika format texture compressionPerangkat keras grafis 3D memerlukan Tekstur untuk dikompresi dalam format khusus yang dioptimalkan untuk pengambilan sampel Tekstur cepat. More info
Lihat di Glossary yang dipilih tidak cocok untuk platform target, Unity menekan Tekstur ketika Tekstur dimuat, mengkonsumsi kedua waktu CPU dan jumlah memori yang berlebihan. Ini paling umum masalah pada perangkat Android, yang sering mendukung format kompresi tekstur yang sangat berbeda tergantung pada chipset.
Enforce sensible Texture size limits
Meskipun ini sederhana, juga sangat mudah untuk melupakan ukuran ulang Tekstur atau untuk mengubah ukuran secara tidak sengaja pengaturan impor ukuran Tekstur. Menentukan ukuran maksimum yang masuk akal untuk berbagai jenis Tekstur dan menegakkan ini melalui kode.
Untuk banyak aplikasi mobile, 2048x2048 atau 1024x1024 cukup untuk Tekstur dilase, dan 512x512 cukup untuk Tekstur yang diterapkan pada model 3D.
Disable the Read/Write enabled flag
BenderaRead/Write enabled
untuk model beroperasi identik dengan yang dijelaskan untuk Tekstur. Namun, diaktifkan secara default untuk model.
Unity membutuhkan bendera ini diaktifkan jika proyek memodifikasi MeshGrafik utama primitif Unity. Mesh membuat sebagian besar dunia 3D Anda. Unity mendukung mesh poligon triangulat atau Quadrangulasi. Nurbs, Nurms, permukaan Subdiv harus dikonversi ke poligon. More info
Lihat di Glossary pada runtime melalui script, atau jika Mesh digunakan sebagai dasar untuk komponen MeshCollider. Jika model tidak digunakan dalam MeshCollider dan tidak dimanipulasi oleh scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary, menonaktifkan bendera ini untuk menghemat setengah memori model.
Disable rigs on non-character models
Secara default, Unity mengimpor rig generik untuk model non-karakter. Ini menyebabkan komponen Animator
harus ditambahkan jika model disaat bersamaan. Jika model tidak animasi melalui sistem Animasi, ini menambahkan overhead yang tidak perlu ke sistem animasi, karena semua Animators aktif harus dicentang sekali per bingkai.
Cacat rig pada model non-animated untuk menghindari penambahan otomatis ini dari Animator componentKomponen pada model yang merupakan model yang menggunakan sistem Animasi. Komponen ini memiliki referensi aset Animator Controller yang mengontrol animasi. More info
Lihat di Glossary dan kemungkinan penambahan inadvertent Animators yang tidak diinginkan untuk SceneAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary.
Enable the Optimize Game Objects option on animated models
Opsi Optimize Game Objects memiliki dampak kinerja yang signifikan pada model animasi. Ketika opsi dinonaktifkan, Unity menciptakan perubahan hierarki yang besar mencerminkan struktur tulang model setiap kali model disaatkan. Hirarki transformasi ini mahal untuk memperbarui, terutama jika komponen lain (seperti Sistem Partikel atau Colliders) melekat padanya. Ini juga membatasi kemampuan Unity untuk multithread Mesh skinningProses mengikat sendi tulang ke vertices mesh karakter atau ‘skin’. Dilakukan dengan alat eksternal, seperti Blender atau Autodesk Maya. More info
Lihat di Glossary dan perhitungan animasi tulang.
Jika lokasi tertentu pada struktur tulang model perlu terkena (seperti mengekspos tangan model untuk secara dinamis melampirkan model senjata) maka lokasi ini dapat secara khusus diperbolehkan dalam daftar Extra Transforms
.
Beberapa rincian tambahan dapat ditemukan di halaman Manual Unity di .
Use Mesh compression when possible
Mengaktifkan Kompresi Mesh mengurangi jumlah bit yang digunakan untuk mewakili nomor titik mengambang untuk saluran yang berbeda dari data model. Ini dapat menyebabkan hilangnya kecil presisi, dan efek imprecision ini harus diperiksa oleh seniman sebelum digunakan dalam proyek akhir.
Jumlah spesifik bit yang digunakan tingkat kompresi yang diberikan rinci dalam Referensi Scripting.
Perhatikan bahwa dimungkinkan untuk menggunakan tingkat kompresi yang berbeda untuk saluran yang berbeda, sehingga proyek dapat memilih untuk mengompres hanya tangents dan normal sambil meninggalkan UV dan posisi vertex tidak terkompresi.
Note: Mesh RendererA mesh component that takes the geometry from the Mesh Filter and renders it at the position defined by the object’s Transform component. More info
See in Glossary Settings
Saat menambahkan Mesh Renderers ke PrefabsJenis aset yang memungkinkan Anda untuk menyimpan GameObject lengkap dengan komponen dan properti. Prefab bertindak sebagai template dari mana Anda dapat membuat instance objek baru di tempat kejadian. More info
Lihat di Glossary atau GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary, perhatikan pengaturan pada komponen. Secara default, Unity memungkinkan pengecoran bayangan dan menerima, sampling Light Probeprobe cahaya menyimpan informasi tentang bagaimana cahaya melewati ruang di tempat kejadian Anda. Koleksi probe cahaya yang diatur dalam ruang tertentu dapat meningkatkan pencahayaan pada objek bergerak dan pemandangan LOD statis dalam ruang itu. More info
Lihat di Glossary, sampling Reflection ProbeKomponen rendering yang menangkap pandangan bulat dari sekitarnya di semua arah, seperti kamera. Gambar yang ditangkap kemudian disimpan sebagai kubus yang dapat digunakan oleh benda dengan bahan reflektif. More info
Lihat di Glossary, dan perhitungan vektor gerak.
Jika proyek tidak memerlukan satu atau lebih fitur ini, pastikan bahwa mereka dimatikan oleh skrip otomatis. Setiap kode runtime yang menambahkan MeshRenderers perlu untuk beralih pengaturan ini juga.
Untuk game 2D, secara tidak sengaja menambahkan MeshRenderer ke Adegan dengan opsi bayangan dihidupkan untuk menambahkan bayangan penuh yang lewat ke loop rendering. Ini umumnya merupakan limbah kinerja.
Platform-appropriate compression settings
Aktifkan format kompresi untuk audio yang sesuai dengan perangkat keras yang tersedia. Semua perangkat iOS termasuk dekompresor MP3, dan banyak perangkat Android mendukung Vorbis secara asli.
Lebih lanjut, impor file audio yang tidak terkompresi menjadi Unity. Unity selalu menekan audio ketika membangun proyek. Tidak perlu mengimpor audio terkompresi dan kemudian menekannya; ini hanya berfungsi untuk menurunkan kualitas audio clipsSebuah wadah untuk data audio dalam Unity. Unity mendukung aset audio mono, stereo dan multichannel (hingga delapan saluran). Unity dapat mengimpor .aif, .wav, .mp3, dan format file audio .ogg, dan .xm, .mod, .it, dan format modul pelacak .s3m. More info
Lihat di Glossary akhir.
Force audio clips to mono
Beberapa perangkat seluler sebenarnya memiliki speaker stereo. Pada proyek seluler, memaksakan klip audio impor menjadi mono-channel menghentikan konsumsi memori mereka. Pengaturan ini juga berlaku untuk setiap audio tanpa efek stereo, seperti efek suara UI yang paling.
Reduce audio bitrate
Meskipun ini membutuhkan konsultasi dengan desainer audio, upaya untuk meminimalkan bitrate file audio untuk lebih menghemat konsumsi memori dan ukuran proyek yang dibangun.