Ketika Anda mengakses aplikasi Anda, ada beberapa masalah umum yang mungkin Anda temukan. Halaman ini menguraikan bagaimana menyelidiki penyebab beberapa masalah kinerja umum.
Ketika melihat jejak waktu start-up, ada dua metode kunci untuk memeriksa: UnityInitApplicationGraphics
dan UnityLoadApplication
. Dua metode ini adalah tempat utama di mana konfigurasi, aset, dan kode proyek dapat mempengaruhi waktu start-up.
Sitemap Waktu start-up aplikasi Anda berbeda dari platform ke platform. Pada kebanyakan platform, mulai terjadi sementara Note: muncul.layar percikan appears.
Dalam tangkapan layar di atas dari jejak Instrumen dari sebuah proyek Unity contoh yang berjalan pada perangkat iOS, dalam metode startUnity
spesifik platform, perhatikan metode UnityInitApplicationGraphics
dan UnityLoadApplication
.
UnityInitApplicationGraphics
melakukan banyak pekerjaan internal, seperti mengatur perangkat grafis dan menginisialisasi banyak sistem internal Unity. Ini juga menginisialisasikan Sistem sumber daya dengan memuat indeks semua file yang terkandung dalam sistem Sumber Daya.
Unity's Sistem sumber daya mencakup setiap file aset dalam data yang berada di folder Resources
dalam folder Assets
proyek Anda. Ini termasuk file apa pun di folder anak-anak folder Resources
. Seperti itu, waktu yang diperlukan untuk menginisialisasi sistem Sumber Daya meningkat dalam korelasi dengan jumlah file dalam folder Resources
dalam proyek aplikasi Anda.
UnityLoadApplication
mengandung metode yang memuat dan menginisialisasi 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 pertama dalam proyek. Ini termasuk deserializing dan instantiating data yang diperlukan untuk menampilkan Adegan pertama, seperti membandingkan ShadersProgram yang berjalan di GPU. More info
Lihat di Glossary, mengunggah Tekstur dan mengulang 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. Juga, Unity mengeksekusi panggilan Awake
dari semua MonoBehaviour
s di Adegan pertama.
Proses ini berarti bahwa jika ada kode jangka panjang dalam panggilan Awake
di Adegan pertama proyek, kode itu dapat bertanggung jawab untuk memperlambat waktu start-up awal proyek. Memperkuat ini melibatkan baik menghilangkan kode lambat, atau mengeksekusinya di tempat lain dalam siklus hidup aplikasi.
Untuk menprofilkan jejak ditangkap setelah waktu startup awal, tempat utama minat adalah metode PlayerLoop
. Ini adalah loop utama Unity, dan kode dalam berjalan sekali per bingkai.
screenshot di atas menggambarkan beberapa metode yang paling berkinerja dalam PlayerLoop
. Login Nama metode dalam Note: mungkin bervariasi antara versi Unity.PlayerLoop
might vary between Unity versions.
PlayerRender
adalah metode yang menjalankan sistem rendering Unity. Ini termasuk benda-benda penanaman, menghitung batch dinamis, dan menyerahkan instruksi menggambar ke GPU. Efek Gambar atau panggilan skrip berbasis rendering (Login Sitemap, misalnya) juga berjalan di sini. Secara umum, ini harus menjadi konsumen atas waktu CPU sementara proyek interaktif.
BaseBehaviourManager
memanggil tiga versi template dari CommonUpdate
. Ini membayangkan panggilan tertentu dalam MonoBehaviour
s melekat pada GameObjects aktif di Adegan saat ini:
CommonUpdate<UpdateManager>
panggilan Update
callbacksCommonUpdate<LateUpdateManager>
panggilan LateUpdate
callbacksCommonUpdate<FixedUpdateManager>
panggilan FixedUpdate
jika sistem fisika telah menggelitikSecara umum, BaseBehaviourManager::CommonUpdate<UpdateManager>
adalah metode keluarga yang paling berguna untuk memeriksa, karena titik masuk untuk sebagian besar kode skrip yang berjalan dalam proyek Unity.
Ada beberapa metode lain yang berguna untuk memeriksa:
UI::CanvasManager
memanggil beberapa callback yang berbeda jika proyek menggunakan . Ini termasuk komputasi batch Unity UI(User Interface) Memungkinkan pengguna untuk berinteraksi dengan aplikasi Anda. Unity saat ini mendukung tiga sistem UI. More infoCanvasManager
muncul di 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 infoDelayedCallManager::Update
berjalan coroutines.PhysicsManager::FixedUpdate
menjalankan sistem fisika PhysX. Ini terutama melibatkan menjalankan kode internal PhysX. Jumlah objek fisika di Adegan saat ini, seperti Rigidbody
dan Collider
mempengaruhi kode internal PhysX. Callback berbasis fisika juga muncul di sini: khususnya, OnTriggerStay
dan OnCollisionStay
.Jika proyek menggunakan 2D fisika, yang muncul sebagai set panggilan yang sama di bawah Physics2DManager::FixedUpdate
.
Ketika 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 divoked pada platform lintas-dipilih dengan IL2CPPBack-end scripting bersatu yang dapat Anda gunakan sebagai alternatif untuk Mono ketika proyek bangunan untuk beberapa platform. More info
Lihat di Glossary, mencari garis jejak yang mengandung objek ScriptingInvocation
. Ini adalah titik di mana transisi kode asli internal Unity ke runtime script untuk mengeksekusi kode skrip. Login Secara teknis, setelah Unity menjalankan kode C# Anda melalui IL2CPP, itu juga menjadi kode asli. Namun, kode silang ini terutama mengeksekusi metode melalui framework runtime IL2CPP dan tidak menyerupai handwritten C++.Note: Technically, after Unity runs your C# code through IL2CPP, it also becomes native code. However, this cross-compiled code primarily executes methods via the IL2CPP runtime framework and doesn’t resemble handwritten C++.
Dalam tangkapan layar di atas, metode di bawah garis RuntimeInvoker_Void
adalah bagian dari skrip C# yang dikompilkan dengan Unity mengeksekusi sekali per bingkai.
Nama garis jejak adalah nama kelas asli yang diikuti oleh underscore dan nama metode asli. Dalam contoh ini, Anda dapat melihat metode EventSystem.Update
, PlayerShooting.Update
dan beberapa metode Update
lainnya. Ini adalah callback Unity Update
standar yang ditemukan di sebagian besar MonoBehaviours
.
Anda dapat memperluas metode ini untuk melihat metode mana dalam waktu CPU yang dikonsumsi. Ini termasuk metode skrip lain dalam proyek, API Unity, dan kode pustaka C #.
Jejak di atas menunjukkan bahwa metode StandaloneInputModule.Process
adalah pengecoran sinar melalui seluruh UI sekali per bingkai. Metode ini mendeteksi apakah ada peristiwa sentuh yang hovering, atau mengaktifkan elemen UI. Metode itu memperbarui semua elemen UI, dan menguji apakah posisi mouse berada dalam sudut pandang mereka adalah sumber daya intensif.
Anda juga dapat mengidentifikasi pemuatan aset di jejak CPU. Metode utama yang menunjukkan beban Aset adalah SerializedFile::ReadObject
. Metode ini menghubungkan aliran data biner dari file ke sistem serialisasi Unity, yang beroperasi melalui metode bernama Transfer
. Metode Transfer
adalah pada semua jenis aset, seperti Tekstur, MonoBehaviours dan Particle SystemsKomponen yang mensimulasikan entitas fluida seperti cairan, awan dan nyala dengan menghasilkan dan memikat sejumlah besar gambar 2D kecil di tempat kejadian. More info
Lihat di Glossary.
Di atas screenshot adalah jejak Unity memuat Adegan. Ketika itu memuat Adegan, Unity membaca dan mendedikasikan semua Aset di dalam Adegan, seperti didebukan oleh panggilan ke berbagai metode Transfer
di bawah SerializedFile::ReadObject
.
Jika Anda melihat stutter kinerja selama runtime dan jejak kinerja menunjukkan bahwa SerializedFile::ReadObject
menggunakan jumlah waktu yang signifikan, itu berarti bahwa Aset memuat laju bingkai. Note: SerializedFile::ReadObject
biasanya muncul pada benang utama ketika SceneManager
, Resources
atau AssetBundle API meminta beban Aset sinkron.
Untuk menyelesaikan stutter kinerja ini dapat Anda membuat Aset memuat asinkron (yang memindahkan panggilan ReadObject
berat ke benang pekerja), atau preload aset berat tertentu.
Transfer
panggilan juga muncul ketika objek Klon Unity (ditandai oleh metode CloneObject
dalam jejak). Jika panggilan ke Transfer
muncul di bawah panggilan CloneObject
, maka Unity tidak memuat Aset dari penyimpanan. Sebaliknya, Unity mentransfer data objek lama ke objek baru. Untuk melakukan hal ini, Unity serialisasi objek lama dan mendedikasikan data yang dihasilkan sebagai objek baru.