Ketika Anda mengoptimalkan kinerja aplikasi Anda, satu faktor penting untuk dipertimbangkan adalah alokasi memori. Dokumentasi ini memberikan informasi pada tipe allokator memori asli Unity, dan menjelaskan skenario di mana Anda dapat menyesuaikan alokasi untuk meningkatkan kinerja. Hal ini dimaksudkan untuk pengguna dengan pemahaman umum tentang allokator.
Untuk referensi penuh dari jenis allokator dan nilai default mereka, lihat Kustomisasi allokators.
Aplikasi menggunakan aokator memori untuk menyeimbangkan kinerja dan ruang memori yang tersedia. Jika aplikasi memiliki banyak memori cadangan, itu dapat mendukung alokasi yang lebih cepat, berat memori ketika memuat scenesAdegan 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 dan bingkai. Namun, jika aplikasi memiliki memori terbatas, perlu menggunakan memori secara efisien, bahkan jika itu berarti menggunakan aokator yang lebih lambat. Untuk membantu Anda mendapatkan kinerja terbaik untuk proyek yang berbeda, Anda dapat menyesuaikan alokasi Unity agar sesuai dengan ukuran dan persyaratan setiap aplikasi.
Unity memiliki lima jenis allokator. Setiap jenis memiliki algoritma yang berbeda untuk alokasi pas ke blok memori, dan karena itu berguna untuk alokasi yang berbeda. Perbedaan penting antara alokasi biasanya bertahan, atau umur alokasi, yang menentukan di mana alokasi harus pergi. Misalnya, alokasi panjang hidup (persistent) pergi ke alokasi heap dan ember, sementara alokasi berumur pendek pergi ke alokasi benang yang aman linier dan TLS.
Tabel ini mencantumkan algoritma dan penggunaan masing-masing jenis allokator:
Allocator type | Algorithm | Used for |
---|---|---|
Heap dinamis | Dua Tingkat Segregated Fit (TLSF) | • Allocator utama • Gfx allocator • Hepatitis C Virus (HCV) File cache allocator • Profiler allocator • Editor Profiler allocator (hanya Editor) • Editor Profiler allocator (on Editor only) |
Bucket | Tetap ukuran lorong bebas kunci | Sebagai alokasi bersama untuk alokasi kecil untuk: • Allocator utama • Gfx allocator • Hepatitis C Virus (HCV) Home > Sitemap • File cache allocator |
Benang ganda | Redirects alokasi berdasarkan ukuran dan benang ID | • Allocator utama • Gfx allocator • Hepatitis C Virus (HCV) Home > Sitemap • File cache allocator |
Thread Penyimpanan Lokal (TLS) stack | LIFO stack | Alokasi sementara |
Threadsafe linear | Login Login | Buffer untuk melewati data ke pekerjaan |
Note: Contoh dalam dokumentasi ini menggunakan laporan penggunaan memori yang ditulis ke log ketika Anda menutup pemain atau Editor. Untuk menemukan file log Anda, ikuti petunjuk pada the log files page.
Bagian ini meninjau skenario fungsi dan kustomisasi untuk heap dinamis, ember dan alokasi benang ganda.
dual thread allocator adalah pembungkus yang menggabungkan allokator dynamic dan bucket. Lebih khusus, menggabungkan:
Dua allokator heap dinamis: Insokator bebas kunci untuk benang utama, dan aokator yang dibagikan oleh semua benang lainnya, yang mengunci alokasi dan alokasi. Unity menggunakan alokasi ini untuk alokasi yang terlalu besar untuk alokasi ember. Allocator heap dinamis menggunakan blok memori. Alokasi yang sama dengan atau lebih dari setengah blok pergi ke sistem memori virtual bukan alokasi heap dinamis.
A ember allokator untuk alokasi kecil. Jika ember allokator penuh, tumpahan alokasi ke alokasi dinamis allokator.
Allocator heap utama adalah allokator heap dinamis. Ini menerapkan algoritma Dua Tingkat Segregated Fit (TLSF) untuk memblokir memori.
Setiap platform memiliki ukuran blok default, yang dapat Anda sesuaikan. Alokasi harus lebih kecil dari setengah blok. Jika alokasi sama dengan atau lebih besar dari setengah blok, terlalu besar untuk alokasi heap dinamis; bukan, Unity menggunakan API memori virtual untuk membuat alokasi.
Contoh laporan penggunaan untuk allokator heap dinamis:
[ALLOC_DEFAULT_MAIN]
Peak usage frame count: [16.0 MB-32.0 MB]: 497 frames, [32.0 MB-64.0 MB]: 1 frames
Requested Block Size 16.0 MB
Peak Block count 2
Peak Allocated memory 54.2 MB
Peak Large allocation bytes 40.2 MB
Dalam contoh ini, ukuran blok TLSF diatur ke 16 MB, dan Unity telah mengalokasikan dua blok. Penggunaan puncak dari allokator adalah 54.2MB. Dari 52.4MB, 40.2MB tidak dialokasikan di blok TLSF, dan bukannya kembali ke memori virtual. Sebagian besar bingkai memiliki 16-32MB memori yang dialokasikan, sementara satu bingkai - kemungkinan bingkai pemuatan - di puncak pada 32-64MB memori.
Jika Anda meningkatkan ukuran blok alokasi besar akan tinggal di landak dinamis daripada jatuh kembali ke memori virtual. Namun, ukuran blok dapat menyebabkan limbah memori, karena blok mungkin tidak sepenuhnya digunakan.
Untuk menghindari menggunakan aokator tipe dan cache, set ukurannya ke 0. Alokasi yang akan menggunakan tipetree dan cache akan jatuh kembali ke alokasi utama. Hal ini dapat menyebabkan lebih banyak fragmentasi, tetapi menyimpan memori blok memori allokators.
Allocator bucket adalah aokator bebas kunci cepat yang melakukan alokasi kecil. Biasanya, ember allocator digunakan sebagai langkah pertama untuk mempercepat alokasi kecil, sebelum mereka pergi ke alokasi heap.
Allocator berhak untuk alokasi. Setiap blok dibagi menjadi subsections 16KB. Ini tidak dapat dikonfigurasi, dan tidak muncul di antarmuka pengguna. Setiap bagian dibagi menjadi allocations. Ukuran alokasi adalah beberapa ukuran tetap yang dikonfigurasi, yang disebut granularity.
Pengaturan contoh berikut menunjukkan proses mengamati blok untuk alokasi:
Dalam pengaturan ini, total ukuran block (Bucket Allocator Block Size) adalah 4MB, dan granularitas alokasi (Bucket Allocator Granularity) adalah 16B. Alokasi pertama adalah 16B, yang kedua adalah 32B (2 * 17), maka 48B, 64B, 80B, 96B, 112B, dan 128B, untuk total delapan ember (Bucket Allocator BucketCount).
Setiap bagian mengandung sejumlah ember yang berbeda. Untuk menghitung jumlah ember di bagian bawah, membagi ukuran penampang (16KB) dengan ukuran granularitas. Contoh:
Bucket allocators menghasilkan laporan penggunaan yang berbeda untuk build development buildMembangun pengembangan termasuk simbol debug dan memungkinkan Profiler. More info
Lihat di Glossary dan rilis, karena pembangunan build, setiap alokasi memiliki header 40B tambahan. Diagram berikut menunjukkan perbedaan antara pembangunan dan rilis build untuk alokasi 16B dan 64B:
Judul juga merupakan alasan laporan allokator penuh setelah mengalokasikan hanya 2MB dari 4MBnya:
[ALLOC_BUCKET]
Large Block size 4.0 MB
Used Block count 1
Peak Allocated bytes 2.0 MB
Failed Allocations. Bucket layout:
16B: 64 Subsections = 18724 buckets. Failed count: 3889
32B: 17 Subsections = 3868 buckets. Failed count: 169583
48B: 31 Subsections = 5771 buckets. Failed count: 39674
64B: 28 Subsections = 4411 buckets. Failed count: 9981
80B: 17 Subsections = 2321 buckets. Failed count: 14299
96B: 6 Subsections = 722 buckets. Failed count: 9384
112B: 44 Subsections = 4742 buckets. Failed count: 5909
128B: 49 Subsections = 4778 buckets. Failed count: 8715
Dalam rilis build untuk proyek yang sama, ukuran blok allocator cukup:
[ALLOC_BUCKET]
Large Block size 4.0 MB
Used Block count 1
Peak Allocated bytes 3.3 MB
Jika ember allokator penuh, alokasi jatuh kembali ke alokasi lain. Laporan penggunaan menampilkan statistik penggunaan, termasuk berapa banyak alokasi gagal. Jika laporan menampilkan jumlah gagal yang meningkatkan linear, kemungkinan alokasi gagal terjadi ketika menghitung bingkai, bukan beban. Alokasi Fallback bukan masalah untuk beban adegan, tetapi mereka dapat mempengaruhi kinerja jika mereka terjadi ketika menghitung bingkai.
Untuk mencegah alokasi fallback ini, meningkatkan ukuran blok, dan membatasi ukuran blok baru untuk mencocokkan penggunaan puncak bingkai, daripada penggunaan puncak beban adegan. Hal ini mencegah blok menjadi begitu besar yang cadangan banyak memori yang kemudian tidak tersedia pada waktu runtime.
Tip: Allocators 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 berbagi contoh a ember allokator. Anda dapat menyesuaikan instance bersama ini di Allocator Bucket Profiler.
Allocator benang ganda membungkus alokasi ember bersama untuk alokasi kecil, dan dua kasus allokator heap dinamis: alokasi bebas kunci untuk benang utama, dan alokasi yang dibagikan oleh semua benang lainnya, tetapi kunci di alokasi dan alokasi.
Anda dapat menyesuaikan ukuran blok dari dua allokator heap dinamis:
Laporan penggunaan berisi informasi untuk semua tiga bagian dari allokator. Contoh:
[ALLOC_DEFAULT] Dual Thread Allocator
Peak main deferred allocation count 135
[ALLOC_BUCKET]
Large Block size 4.0 MB
Used Block count 1
Peak Allocated bytes 3.3 MB
[ALLOC_DEFAULT_MAIN]
Peak usage frame count: [16.0 MB-32.0 MB]: 8283 frames, [32.0 MB-64.0 MB]: 1 frames
Requested Block Size 16.0 MB
Peak Block count 2
Peak Allocated memory 53.3 MB
Peak Large allocation bytes 40.2 MB
[ALLOC_DEFAULT_THREAD]
Peak usage frame count: [64.0 MB-128.0 MB]: 8284 frames
Requested Block Size 16.0 MB
Peak Block count 2
Peak Allocated memory 78.3 MB
Peak Large allocation bytes 47.3 MB
Note: Peak main deferred allocation count adalah jumlah item dalam antrian penghapusan. Benang utama harus menghapus alokasi yang dibuat. Jika benang lain menghapus alokasi, alokasi ditambahkan ke antrian. Alokasi menunggu di antrian untuk benang utama untuk menghapusnya. Kemudian dihitung sebagai alokasi deferred.
Bagian ini menjelaskan skenario fungsi dan kustomisasi untuk Thread Local Storage (TLS) dan allokator linier threadsafe.
Unity memiliki dua allokators yang bekerja di luar alokasi benang ganda:
Thread Penyimpanan Lokal (TLS): Allocator berbasis stack untuk alokasi sementara yang cepat. Ini adalah aokator tercepat karena memiliki hampir tidak ada overhead. Hal ini juga mencegah fragmentasi. Ini terakhir di, pertama di luar (LIFO) berbasis.
Threadsafe linier: Pertama In, Pertama Out (FIFO) bulat-robin allokator yang sementara alokasi pekerjaan untuk melewati memori berumur pendek antara benang pekerja).
Setiap benang menggunakan alokasi tumpukan cepat sendiri untuk alokasi sementara. Alokasi ini sangat cepat, dengan umur kurang dari bingkai.
Ukuran blok default untuk aokator sementara adalah 4MB untuk platform dan 16MB untuk Editor Unity. Anda dapat menyesuaikan nilai-nilai ini.
Note: Jika penggunaan allokator melebihi ukuran blok yang dikonfigurasi, Unity meningkatkan ukuran blok. Batas kenaikan ini dua kali ukuran aslinya.
Jika alokasi tumpukan benang penuh, alokasi jatuh kembali ke threadsafe linear pekerjaan allokator. Beberapa alokasi overflow halus: 1 hingga 10 dalam bingkai, atau beberapa ratus selama beban. Namun, jika angka tumbuh pada setiap bingkai, Anda dapat meningkatkan ukuran blok.
Informasi dalam laporan penggunaan dapat membantu Anda memilih ukuran blok yang sesuai untuk aplikasi Anda. Misalnya, dalam laporan penggunaan benang utama berikut, puncak beban di 2.7MB, tetapi bingkai yang tersisa di bawah 64KB. Anda dapat mengurangi ukuran blok dari 4MB ke 64KB dan memungkinkan bingkai pemuatan untuk tumpahkan di atas alokasi:
[ALLOC_TEMP_TLS] TLS Allocator
StackAllocators :
[ALLOC_TEMP_MAIN]
Peak usage frame count: [16.0 KB-32.0 KB]: 802 frames, [32.0 KB-64.0 KB]: 424 frames, [2.0 MB-4.0 MB]: 1 frames
Initial Block Size 4.0 MB
Current Block Size 4.0 MB
Peak Allocated Bytes 2.7 MB
Overflow Count 0
[ALLOC_TEMP_Job.Worker 18]
Dalam contoh kedua ini, benang pekerja tidak digunakan untuk alokasi sementara besar. Untuk menghemat memori, Anda dapat mengurangi ukuran blok pekerja ke 32KB. Ini terutama berguna pada mesin multi-core, di mana setiap benang pekerja memiliki tumpukan sendiri:
[ALLOC_TEMP_Job.Worker 14]
Initial Block Size 256.0 KB
Current Block Size 256.0 KB
Peak Allocated Bytes 18.6 KB
Overflow Count 0
Benang pekerja di Unity menggunakan algoritma pertama-in-first-out (FIFO) untuk cepat, alokasi bebas kunci dari buffer kerja untuk pekerjaan. Pekerjaan membuang penyangga saat dilakukan.
Blok allokator allokates memori ini, kemudian linear mengalokasikan memori dalam blok tersebut. Blok yang tersedia diadakan di kolam renang. Ketika satu blok penuh, allocator mengambil blok baru dari kolam renang. Ketika allokator tidak perlu lagi memori di blok, membersihkan blok, dan blok kembali ke kolam blok yang tersedia. Penting untuk membersihkan alokasi dengan cepat untuk membuat blok yang tersedia lagi, jadi pekerjaan tidak harus tinggal dialokasikan untuk lebih dari beberapa bingkai.
Anda dapat menyesuaikan ukuran blok. Allocator mengalokasikan hingga 64 blok, sesuai kebutuhan.
Jika semua blok digunakan, atau alokasi terlalu besar untuk blok, alokasi jatuh kembali ke alokasi utama, yang jauh lebih lambat daripada alokasi pekerjaan. Beberapa alokasi aliran halus: 1 hingga 10 dalam bingkai, atau beberapa ratus, terutama selama beban. Jika hitungan overflow tumbuh dengan setiap bingkai, Anda dapat meningkatkan ukuran blok untuk menghindari alokasi fallback. Namun, jika Anda meningkatkan ukuran blok terlalu banyak (misalnya, untuk mencocokkan penggunaan puncak dalam acara seperti pemuatan adegan), Anda mungkin meninggalkan banyak memori yang tidak tersedia selama bermain.
Contoh:
[ALLOC_TEMP_JOB_4_FRAMES (JobTemp)]
Initial Block Size 0.5 MB
Used Block Count 64
Overflow Count (too large) 0
Overflow Count (full) 50408
Dalam laporan penggunaan ini, ukuran blok 0,5MB terlalu kecil untuk mengakomodasi memori pekerjaan yang diperlukan aplikasi, dan alokasi penuh menyebabkan sejumlah besar alokasi untuk meluap.
Untuk memeriksa apakah alur bingkai build Anda cukup, jalankan untuk waktu singkat dan kemudian untuk waktu yang lebih lama. Jika jumlah overflow tetap stabil, overflow adalah tanda air tinggi yang terjadi selama beban. Jika jumlah overflow meningkat dengan jangka panjang, build memproses overflow per-frame. Dalam kedua kasus, Anda dapat meningkatkan blokisasi untuk mengurangi overflow, tetapi overflow kurang penting selama beban dari per bingkai.
Untuk menyesuaikan pengaturan allokator, lakukan salah satu berikut:
-memorysetup-main-allocator-block-size=<new_value>
Nama parameter allokator dan nilai default mereka:
Allocator | Description | Parameter name | Default value | ||
---|---|---|---|---|---|
Alokator Utama | Penggunaan allokators Unity untuk sebagian besar alokasi. | ||||
Alokator Utama | Penggunaan Unity allokator utama untuk sebagian besar alokasi. | ||||
Ukuran Blok Thread Utama | Ukuran blok dari alokasi benang utama khusus. | memorysetup-main-allocator-block-size |
16777216 |
||
Ukuran Blok Thread Bersama | Ukuran blok dari allokator benang bersama. | memorysetup-thread-allocator-block-size |
16777216 |
||
Gfx Allocator | Penggunaan Unity allocator untuk alokasi CPU yang terkait dengan sistem Gfx. | ||||
Ukuran Blok Thread Utama | Ukuran blok dari benang utama khusus gfx allocator. | memorysetup-gfx-main-allocator-block-size |
16777216 |
||
Ukuran Blok Thread Bersama | Ukuran blok dari allocator benang bersama. | memorysetup-gfx-thread-allocator-block-size |
16777216 |
||
Other Allocators | |||||
Ukuran Blok Cache File | Cache file memiliki aokator sendiri untuk menghindari fragmentasi. Ini adalah ukuran bloknya. | memorysetup-cache-allocator-block-size |
4194304 |
||
Jenis Ukuran Blok Pohon | Jenis pohon memiliki aokator mereka sendiri untuk menghindari fragmentasi karena banyak alokasi kecil. Ini adalah ukuran bloknya. | memorysetup-typetree-allocator-block-size |
2097152 |
||
Allocator Bucket Bersama | Alokator bucket yang dibagikan antara aokator utama. | ||||
Home > Sitemap | Ukuran langkah untuk bucket di allokator bersama. | memorysetup-bucket-allocator-granularity |
16 |
||
Home > Sitemap | Jumlah ukuran bucket. | memorysetup-bucket-allocator-bucket-count |
8 |
||
Ukuran Blok Allocator Bucket | Ukuran blok memori yang digunakan untuk ember. | memorysetup-bucket-allocator-block-size |
Editor: 8388608 Player: 4194304 |
||
Bucket Allocator Blok Count | Jumlah blok maksimum untuk dialokasikan. | memorysetup-bucket-allocator-block-count |
Editor: 8 Player: 1 |
||
Cepat Per Thread Sementara Allocators | The Thread Local Storage (TLS) allocator yang menangani alokasi yang sangat berumur pendek. | ||||
Ukuran Blok Thread Utama | Ukuran awal untuk tumpukan benang utama. | memorysetup-temp-allocator-size-main |
Editor: 16777216 Player: 4194304 |
||
Ukuran Blok Pekerja Pekerjaan | Ukuran setiap pekerja pekerjaan di sistem kerja Unity. | memorysetup-temp-allocator-size-job-worker |
E262144 |
||
Ukuran Blok Pekerja Latar Belakang | Ukuran untuk setiap pekerja latar belakang. | memorysetup-temp-allocator-size-background-worker |
32768 |
||
Ukuran Blok Preload | Ukuran tumpukan manajer preload. | memorysetup-temp-allocator-size-preload-manager |
Editor: 33554432 Player: 262144 |
||
Ukuran Blok Pekerja Audio | Setiap ukuran tumpukan benang pekerja audio. | memorysetup-temp-allocator-size-audio-worker |
65536 |
||
Ukuran Blok Worker Cloud | Benang pekerja cloud ukuran tumpukan. | memorysetup-temp-allocator-size-cloud-worker |
32768 |
||
Gfx Thread Blocksize | Ukuran tumpukan benang render utama. | memorysetup-temp-allocator-size-gfx |
262144 |
||
GI Baking Blocksize | Setiap ukuran tumpukan benang pekerja GI. | memorysetup-temp-allocator-size-gi-baking-worker |
262144 |
||
NavMeshSebuah mesh yang Unity menghasilkan perkiraan daerah dan hambatan yang dapat berjalan di lingkungan Anda untuk mencari jalan dan navigasi yang dikendalikan AI. More info Lihat di Glossary Worker Block Size |
Nav 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 lembar kerja ukuran tumpukan. |
memorysetup-temp-allocator-size-nav-mesh-worker |
65536 |
||
Cepat Thread Bersama Sementara Allocators | Alokator linier cepat untuk alokasi hidup pendek dibagi antara benang. | ||||
Ukuran Blok Allocator Pekerjaan | Round robin linear thread allocator Unity terutama digunakan untuk pekerjaan pekerja benang. | memorysetup-job-temp-allocator-block-size |
2097152 |
||
Latar Belakang Job Allocator Block Ukuran | Alokator linier untuk pekerja latar belakang yang memungkinkan alokasi hidup lebih lama. | memorysetup-job-temp-allocator-block-size-background |
21048576 |
||
Ukuran Blok Allocator Job pada platform memori rendah | Platform dengan kurang dari memori 2GB menggunakan ukuran ini untuk pekerja kerja dan pekerjaan latar belakang. | memorysetup-job-temp-allocator-reduction-small-platforms |
262144 |
||
Profiler Allocators | Allocators yang Unity menggunakan secara eksklusif untuk Profiler sehingga mereka tidak mengganggu pola alokasi aplikasi. | ||||
Profiler Blok Ukuran | Ukuran blok untuk bagian utama dari Profiler. | memorysetup-profiler-allocator-block-size |
16777216 |
||
Editor Profiler Blok Ukuran | Ukuran blok untuk bagian Editor dari Profiler. Ini tidak hadir pada pemain. | memorysetup-profiler-editor-allocator-block-size |
1048576 |
||
Allocator Bucket Profiler | Allocator bucket bersama untuk Profiler dan editor Profiler allocators. Tidak ada di platform memori rendah. |
||||
Home > Sitemap | Ukuran langkah untuk bucket di allokator bersama. | memorysetup-profiler-bucket-allocator-granularity |
16 |
||
Home > Sitemap | Jumlah ukuran bucket. Misalnya, jika nilainya 4, ukurannya 16, 32, 48 dan 64. | memorysetup-profiler-bucket-allocator-bucket-count |
8 |
||
Ukuran Blok Allocator Bucket | Ukuran blok memori yang digunakan untuk ember. | memorysetup-profiler-bucket-allocator-block-size |
Editor: 33554432 Player: 4194304 |
||
Bucket Allocator Blok Count | Jumlah blok maksimum untuk dialokasikan. | memorysetup-profiler-bucket-allocator-block-count |
Editor: 8 Player: 1 |
Tip: Untuk memastikan pengaturan Anda meningkatkan kinerja, profil aplikasi sebelum dan sesudah membuat perubahan. Lihat Profiler overview page untuk informasi lebih lanjut. Anda juga dapat memeriksa laporan penggunaan memori. Mereka tersedia dalam log ketika Anda menutup pemain atau Editor. Untuk menemukan file log Anda, ikuti petunjuk pada log files page.
Pengaturan allokator toko unity di MemorySettings.asset
, yang mengisi file boot.config
dengan pengaturan yang dimodifikasi pada waktu build. Ini berarti pengaturan baru mengambil efek pada setiap build.
Di Editor, boot.config
berada di folder ProjectSettings
. Ini diperbarui setiap kali impor Unity atau perubahan MemorySettings.asset
. Nilai baru untuk Editor hanya mengambil efek pada startup Editor berikutnya.