Membuat panel detail modul kustom
Profiling tools

rendah-level asli plug-in Profiler API

Ini adalah alat yang dapat Anda gunakan untuk menganalisis dan meningkatkan kinerja aplikasi Anda. 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
melakukan panggilan fungsi dalam kode Unity asli dan kode yang dikelola dalam aplikasi Anda. Anda dapat menggunakan penanda untuk memasukkan penanda waktu ke kode Anda sendiri untuk mendapatkan pemahaman yang lebih baik tentang kinerja area spesifik aplikasi Anda.

Anda dapat menggunakan API Perpustakaan kode asli spesifik platform yang diciptakan di luar Unity untuk digunakan di Unity. Memungkinkan Anda dapat mengakses fitur seperti panggilan OS dan perpustakaan kode pihak ketiga yang tidak akan tersedia untuk Unity. More info
Lihat di Glossary
tingkat rendah untuk memperluas Profiler dan profil kinerja kode plug-inSatu set kode yang dibuat di luar Unity yang menciptakan fungsi dalam Unity. Ada dua jenis plug-ins yang dapat Anda gunakan di Unity: Managed plug-ins (diproduksi. Rakitan NET dibuat dengan alat-alat seperti Studio Visual) dan plug-ins asli (pustaka kode asli yang spesifik platform). More info
Lihat di Glossary
asli, atau mempersiapkan data profil untuk mengirim ke alat profil pihak ketiga seperti Razor (PS4), PIX (Xbox, Windows), Chrome Tracing, ETW, ITT, Vtune, atau Telemetri. API plug-in Profiler tingkat rendah menyediakan antarmuka berikut untuk komunikasi antara Unity Profileer dan perkakas eksternal:

  • IUnityProfiler: Gunakan antarmuka ini untuk menambahkan acara instrumentasi ke Unity Profileer dari kode plug-in asli C / C++.
  • IUnityProfilerCallbacks: Gunakan antarmuka ini untuk mencegat acara Unity Profiler dan menyimpan atau mengarahkan mereka ke alat lain.

Profil Login

Gunakan API plug-in IUnityProfiler untuk menambahkan instrumentasi ke kode C / C++ dari plug-ins asli Anda.

API plug-in diwakili oleh antarmuka IUnityProfiler, yang dinyatakan dalam header IUnityProfiler.h. Unity menyimpan header di folder <UnityInstallPath>\Editor\Data\PluginAPI instalasi Unity Anda. (On macOS, klik kanan pada aplikasi Unity, dan pilih Show Package Contents. header di Contents\PluginAPI.

Method Description
CreateMarker Membuat Profiler markerDitempatkan dalam kode untuk menggambarkan acara CPU atau GPU yang kemudian ditampilkan di jendela Unity Profileer. Ditambahkan ke kode Unity secara default, atau Anda dapat menggunakan untuk menambahkan penanda kustom Anda sendiri. More info
Lihat di Glossary
yang mewakili ruang lingkup instrumentasi bernama, yang kemudian Anda gunakan untuk menghasilkan sampel instrumentasi.
SetMarkerMetadataName Menentukan nama parameter kustom yang dapat dilewati bersama dengan sampel instrumentasi untuk penanda Profiler.
BeginSample Memulai bagian instrumentasi dari kode yang dinamakan setelah penanda Profiler.
EndSample Mengakhiri bagian instrumentasi.
EmitEvent Emits peristiwa generik dengan metadata.
IsEnabled Kembali 1 jika Profiler menangkap data.
IsAvailable Kembali 1 untuk Editor atau Pemain Pembangunan di mana Profiler tersedia, dan 0 untuk Pemain Rilis.
RegisterThread Daftarkan benang saat ini di bawah nama yang ditentukan.
UnregisterThread Unregisters benang saat ini dari Profiler.

Contoh penggunaan

Contoh ini menghasilkan Peristiwa profiler yang kemudian ditampilkan di jendela Profiler.

#include <IUnityInterface.h>
#include <IUnityProfiler.h>

static IUnityProfiler* s_UnityProfiler = NULL;
static const UnityProfilerMarkerDesc* s_MyPluginMarker = NULL;
static bool s_IsDevelopmentBuild = false;

static void MyPluginWorkMethod()
{
    if (s_IsDevelopmentBuild)
        s_UnityProfiler->BeginSample(s_MyPluginMarker);

    // Code I want to see in Unity Profiler as "MyPluginMethod".
    // ...

    if (s_IsDevelopmentBuild)
        s_UnityProfiler->EndSample(s_MyPluginMarker);
}

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
    s_UnityProfiler = unityInterfaces->Get<IUnityProfiler>();
    if (s_UnityProfiler == NULL)
        return;
    s_IsDevelopmentBuild = s_UnityProfiler->IsAvailable() != 0;
    s_UnityProfiler->CreateMarker(&s_MyPluginMarker, "MyPluginMethod", kUnityProfilerCategoryOther, kUnityProfilerMarkerFlagDefault, 0);
}

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload()
{
    s_UnityProfiler  = NULL;
}

Profil API callback

API plug-in Profiler asli menyediakan antarmuka antara subsistem Unity dan API profil pihak ketiga sehingga Anda dapat menggunakan alat profil eksternal untuk memberi profil aplikasi Unity Anda. Profil IUnity Callbacks header mengekspos API, yang menyimpan Unity di folder <UnityInstallPath>\Editor\Data\PluginAPI instalasi Unity Anda. (On macOS, klik kanan pada aplikasi Unity, dan pilih Show Package Contents. header di Contents\PluginAPI.

Fitur Unity Profiler berikut membantu menangkap data instrumentasi sehingga Anda dapat menganalisis kinerja aplikasi Anda.

Profiler feature Description
Categories Unity kelompok data profil ke dalam kategori (seperti rendering, Scripting dan Animasi), dan menetapkan warna untuk setiap kategori. Kategori berkode warna membantu Anda secara visual membedakan jenis data di jendela Profiler. API plug-in asli Profiler mengambil warna-warna ini sehingga Anda dapat menggunakannya dalam alat profil eksternal.
Usage flags Penggunaan bendera bertindak sebagai filter yang mengurangi jumlah data yang disatukan mengirim ke alat profil eksternal. Anda dapat menggunakan bendera penggunaan untuk menghapus informasi yang tidak perlu dari data profil sebelum Unity mengirimkannya ke alat eksternal. Profiler menerapkan bendera penggunaan berikut untuk penanda acara sehingga Anda dapat menyaring data:

Availability flagsthat bendera apakah penanda tersedia di Editor Unity, pemain pengembangan, atau pemain rilis.

Verbosity levels yang mengekor ke jenis tugas yang Anda lakukan di Editor, dan tingkat informasi yang dibutuhkan tugas (misalnya, internal, debug, atau tingkat pengguna).
Frame events Anda dapat menggunakan API plug-in asli Profiler untuk melakukan analisis kerangka waktu dalam alat profil eksternal.
Thread profiling Unity melakukan sejumlah besar pekerjaan pada benang (misalnya, benang utama, render benang dan sistem kerja benang). Anda dapat menggunakan API plug-in asli Profiler untuk mengaktifkan profil pada setiap benang.

Untuk menggunakan data instrumentasi yang Unity Profileer menghasilkan profiler eksternal, Anda dapat menggunakan set minimal callback di C / C++ Anda kode plug-in yang mengintegrasikan profiler pihak ketiga:

Callback Function
RegisterCreateCategoryCallback Daftar panggilan IUnityProfilerCreateCategoryCallback untuk mendapatkan nama Profiler categoryMengidentifikasi data beban kerja untuk subsistem Unity (misalnya, rendering, Scripting dan kategori Animasi). Unity menerapkan pengkodean warna untuk kategori untuk secara visual membedakan antara jenis data di jendela Profiler.
Lihat di Glossary
dan warna setiap Unity menciptakan kategori.
RegisterCreateMarkerCallback Daftar callback IUnityProfilerCreateMarkerCallback yang disebut setiap Unity membuat penanda. Gunakan untuk mendapatkan nama, kategori Profiler, dan bendera penggunaan penanda. Parameter const UnityProfilerMarkerDesc* markerDesc dari fungsi callback mewakili pointer terus-menerus untuk deskripsi penanda yang dapat Anda gunakan untuk menyaring penanda dalam RegisterMarkerEventCallback.
RegisterMarkerEventCallback Daftar panggilan IUnityProfilerMarkerEventCallback yang disatukan invokes ketika single-shot, ruang lingkup, alokasi memori, atau acara pengumpulan sampah terjadi. Anda kemudian dapat menggunakan callback ini untuk membatalkan fungsi yang relevan dalam alat profil eksternal. Note: Unity mewakili peristiwa alokasi memori dengan GC. Alloc marker, dan acara koleksi sampah dengan GC. Collectie
RegisterFrameCallback Memungkinkan sampel ke dalam bingkai logis sehingga alat profil eksternal yang tidak menggunakan bingkai dapat menggunakan sampel ini. Juga mendaftarkan panggilan bahwa Unity Profiler berjalan ketika Unity memulai bingkai CPU logis berikutnya.
RegisterCreateThreadCallback Daftarkan callback untuk mendapatkan nama benang internal setiap Unity mendaftarkan benang untuk profil.

Contoh penggunaan

Contoh ini menunjukkan bagaimana untuk lulus acara Unity Profileer ke profiler lain yang telah mendorong/pop semantik. Ini menyediakan dua fungsi:

  • void MyProfilerPushMarker(const char* name) - mendorong penanda nama.
  • void MyProfilerPopMarker() - pops instrumentasi marker.

Contoh berikut memberikan implementasi minimal yang diperlukan untuk lulus mulai dan mengakhiri acara instrumentasi dari Unity Profileer ke profiler eksternal:

#include <IUnityInterface.h>
#include <IUnityProfilerCallbacks.h>

static IUnityProfilerCallbacks* s_UnityProfilerCallbacks = NULL;

static void UNITY_INTERFACE_API MyProfilerEventCallback(const UnityProfilerMarkerDesc* markerDesc, UnityProfilerMarkerEventType eventType, unsigned short eventDataCount, const UnityProfilerMarkerData* eventData, void* userData)
{
    switch (eventType)
    {
        case kUnityProfilerMarkerEventTypeBegin:
        {
            MyProfilerPushMarker(markerDesc->name);
            break;
        }
        case kUnityProfilerMarkerEventTypeEnd:
        {
            MyProfilerPopMarker();
            break;
        }
    }
}

static void UNITY_INTERFACE_API MyProfilerCreateMarkerCallback(const UnityProfilerMarkerDesc* markerDesc, void* userData)
{
    s_UnityProfilerCallbacks->RegisterMarkerEventCallback(markerDesc, MyProfilerEventCallback, NULL);
}

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
    s_UnityProfilerCallbacks = unityInterfaces->Get<IUnityProfilerCallbacks>();
    s_UnityProfilerCallbacks->RegisterCreateMarkerCallback(&MyProfilerCreateMarkerCallback, NULL);
}

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload()
{
    s_UnityProfilerCallbacks->UnregisterCreateMarkerCallback(&MyProfilerCreateMarkerCallback, NULL);
    s_UnityProfilerCallbacks->UnregisterMarkerEventCallback(NULL, &MyProfilerEventCallback, NULL);
}

Sitemap Untuk membongkar panggilan yang diberikan dari semua penanda, menjalankan Note: dengan parameter pertama yang ditetapkan ke UnregisterEventCallback.null.

UnitySystracePlugin contoh

Anda dapat mendaftar dan panggilan penanda yang tidak terdaftar secara dinamis, setelah setiap bingkai. Contoh berikut meminimalkan profil overhead dengan mengaktifkan dan menonaktifkan callback, tergantung pada keadaan profil pihak ketiga.

| static void UNITY_INTERFACE_API SystraceFrameCallback(void* userData)
{
    bool isCapturing = ATrace_isEnabled();
    if (isCapturing != s_isCapturing)
    {
        s_isCapturing = isCapturing;
        if (isCapturing)
        {
            s_UnityProfilerCallbacks->
              RegisterCreateMarkerCallback(SystraceCreateEventCallback, NULL);
        }
        else
        {
            s_UnityProfilerCallbacks->
              UnregisterCreateMarkerCallback(SystraceCreateEventCallback, NULL);
            s_UnityProfilerCallbacks->
              UnregisterMarkerEventCallback(NULL, SystraceEventCallback, NULL);
        }
    }
}

Sitemap Untuk membongkar panggilan yang diberikan dari semua penanda, menjalankan Note: dengan parameter pertama yang ditetapkan ke UnregisterEventCallback.null.

penanda khusus

Unity memiliki penanda khusus berikut yang mengandung metadata yang berguna:

  • Profiler.DefaultMarker
  • GC.Alloc

Profiler.DefaultMarker

Profiler.DefaultMarker adalah penanda yang dimiliki Unity untuk dan acara.

Dalam contoh di atas, kUnityProfilerMarkerEventTypeBegin eventType sesuai dengan peristiwa Profiler.BeginSample dan memiliki data berikut:

  • Int32: ID instance UnityEngine.Object. Ini adalah 0 jika objek tidak ditentukan.
  • UInt16 array: UTF16 string yang dilewatkan ke Profiler.BeginSample. Ukurannya ditekan.
  • UInt32: Indeks kategori.

GC.Alloc

GC.Alloc adalah penanda yang sesuai dengan alokasi pengumpulan sampah. Memiliki data berikut:

  • Int64: Ukuran alokasi.
Membuat panel detail modul kustom
Profiling tools