Profiling tools
Log files

Analyzing profileer jejak

Ketika Anda mengakses aplikasi Anda, ada beberapa masalah umum yang mungkin Anda temukan. Halaman ini menguraikan bagaimana menyelidiki penyebab beberapa masalah kinerja umum.

Memperkuat jejak startup

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.

Instruments trace of an example Unity project running on an iOS device
Instrumen jejak proyek Unity contoh yang berjalan pada perangkat iOS

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 MonoBehaviours 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.

Mengalihkan jejak waktu berjalan

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.

Instruments trace of an example Unity project
Instrumen jejak proyek Unity contoh

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 MonoBehaviours melekat pada GameObjects aktif di Adegan saat ini:

  • CommonUpdate<UpdateManager> panggilan Update callbacks
  • CommonUpdate<LateUpdateManager> panggilan LateUpdate callbacks
  • CommonUpdate<FixedUpdateManager> panggilan FixedUpdate jika sistem fisika telah menggelitik

Secara 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 info
    Lihat di Glossary
    dan pembaruan tata letak; dua operasi yang paling sering menyebabkan CanvasManager 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 info
    Lihat di Glossary
    .
  • DelayedCallManager::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.

Mempertahankan metode skrip

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++.

A trace from an example Unity project
Sebuah jejak dari proyek Unity contoh

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.

Beban aset

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
.

Trace of a Scene loading
Trace dari sebuah adegan pemuatan

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.

Profiling tools
Log files