Memori dalam Unity
kustomisasi allokator memori

Memori terkelola

Unity's managed memory system adalah lingkungan skrip C# berdasarkan Mesin Virtual Mono atau IL2CPP (VMs). Manfaat dari sistem memori yang dikelola adalah mengelola pelepasan memori, sehingga Anda tidak perlu meminta rilis memori melalui kode Anda.

Sistem memori yang dikelola Unity menggunakan kolektor sampah dan managed heap untuk secara otomatis alokasi memori gratis 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
Anda tidak lagi memegang referensi ke alokasi tersebut. Ini membantu menjaga kebocoran memori. Kebocoran memori terjadi ketika memori dialokasikan, referensi untuk hilang, dan kemudian memori tidak pernah dibebas karena perlu reference untuk bebas itu.

Sistem manajemen memori ini juga menjaga akses memori, yang berarti bahwa Anda tidak dapat mengakses memori yang telah dibebaskan, atau itu tidak pernah berlaku untuk kode Anda untuk mengakses. Namun, proses manajemen memori ini mempengaruhi kinerja runtime, karena mengalokasikan memori yang berhasil memakan waktu untuk CPU. Photogallery mungkin juga menghentikan CPU dari melakukan pekerjaan lain sampai selesai.

Jenis nilai dan referensi

Ketika metode disebut, scripting back end menyalin nilai-nilai parameternya ke area memori yang disediakan untuk panggilan tertentu, dalam struktur data yang disebut call stack. Ujung belakang scripting dapat dengan cepat menyalin jenis data yang menempati beberapa byte. Namun, itu umum untuk objek, string, dan array menjadi jauh lebih besar, dan tidak efisien untuk scripting kembali berakhir untuk menyalin jenis data secara teratur.

Semua objek tipe referensi non-null dan semua objek berjenis nilai kotak dalam kode yang dikelola harus dialokasikan pada heap yang dikelola.

Penting bahwa Anda akrab dengan jenis nilai dan referensi, sehingga Anda dapat secara efektif mengelola kode Anda. Untuk informasi lebih lanjut, lihat dokumentasi Microsoft pada jenis nilai, dan jenis referensi.

Manajemen memori otomatis

Ketika sebuah objek diciptakan, mengalokasikan memori yang diperlukan untuk menyimpannya dari kolam pusat yang disebut the heap, yang merupakan bagian dari memori bahwa runtime scripting proyek Unity (Mono atau IL2CPP) secara otomatis mengelola. Ketika sebuah objek tidak lagi digunakan, memori itu pernah diduduki dapat direkrut kembali dan digunakan untuk sesuatu yang lain.

Ujung belakang skrip Unity menggunakan kolektor sampah untuk secara otomatis mengelola memori aplikasi Anda, sehingga Anda tidak perlu mengalokasikan dan melepaskan blok memori ini dengan panggilan metode eksplisit. Manajemen memori otomatis memerlukan upaya pengkodean kurang dari alokasi eksplisit / rilis dan mengurangi potensi kebocoran memori.

Dikelola heap gambaran

managed heap adalah bagian memori yang dipilih oleh proyek Unity runtime (Mono atau IL2CPP) secara otomatis mengelola.

A quantity of memory. Marked A on the diagram is some free memory.
Jumlah memori. Login Pada diagram adalah beberapa memori gratis.

Dalam diagram di atas, kotak biru mewakili jumlah memori yang disatukan untuk heap yang dikelola. Kotak putih di dalamnya mewakili nilai data yang disatukan toko dalam ruang memori heap yang dikelola. Ketika nilai data tambahan diperlukan, Unity mengalokasikan mereka ruang gratis dari heap yang dikelola (disebut A).

Fragmen memori dan ekspansi heap

A quantity of memory, with some objects released represented by grey dashed lines.
Jumlah memori, dengan beberapa objek yang dirilis diwakili oleh garis-garis yang disangka abu-abu.

Diagram di atas menunjukkan contoh fragmentasi memori. Ketika Unity melepaskan objek, memori bahwa objek yang ditempati dibebaskan. Namun, ruang gratis tidak menjadi bagian dari satu kolam besar memori bebas. Sitemap

Objek di kedua sisi objek yang dirilis mungkin masih digunakan. Karena ini, ruang gratis adalah "gap" antara segmen memori lainnya. Unity hanya dapat menggunakan celah ini untuk menyimpan data ukuran identik atau kurang dari objek yang dirilis.

situasi ini disebut memory fragmentation. Hal ini terjadi ketika ada sejumlah besar memori yang tersedia di heap, tetapi hanya tersedia di "gaps" antara benda. Ini berarti bahwa meskipun ada ruang total yang cukup untuk alokasi memori yang besar, heap yang berhasil tidak dapat menemukan blok tunggal yang cukup besar memori terus-menerus untuk menetapkan alokasi.

The object annotated A, is the new object needed to be added to the heap. The items annotated B are the memory space that the released objects took up, plus the free, unreserved memory. Even though there is enough total free space, because there isnt enough contiguous space, the memory for the new object annotated A cant fit on the heap, and the garbage collector must run.
Keberatan sebuah objek, adalah objek baru yang diperlukan untuk ditambahkan ke tuju. Barang-barang yang dinonaktifkan B adalah ruang memori yang objek yang dirilis naik, ditambah memori yang bebas, tidak teramati. Meskipun ada ruang bebas total yang cukup, karena tidak ada ruang yang cukup terus-menerus, memori untuk objek baru yang dibubarkan A tidak bisa cocok di tumpah, dan kolektor sampah harus dijalankan.

Jika objek besar dialokasikan dan tidak ada ruang bebas yang terus-menerus untuk mengakomodasinya, seperti yang diilustrasikan di atas, manajer memori Unity melakukan dua operasi:

  • Pertama, kolektor sampah berjalan, jika belum selesai. Upaya ini untuk membebaskan ruang yang cukup untuk memenuhi permintaan alokasi.
  • Jika, setelah kolektor sampah berjalan, masih belum cukup ruang yang terus-menerus agar sesuai dengan jumlah memori yang diminta, tumpah harus berkembang. Jumlah spesifik bahwa lindung nilai adalah tergantung platform; namun, pada sebagian besar platform, ketika lindung nilai, itu berkembang dengan dua kali lipat jumlah ekspansi sebelumnya.

Pertimbangan ekspansi heap yang terkelola

Ekspansi tak terduga dari tuap dapat bermasalah. Strategi pengumpulan garbage Unity cenderung menyebabkan memori fragmen lebih sering. Anda harus menyadari hal berikut:

  • Unity tidak melepaskan memori yang dialokasikan untuk heap yang berhasil ketika memperluas secara teratur; bukan, ia mempertahankan landak yang diperluas, bahkan jika bagian besar dari itu kosong. Ini adalah untuk mencegah kebutuhan untuk mengandalkan heap jika alokasi besar lebih lanjut terjadi.
  • Pada sebagian besar platform, Unity akhirnya melepaskan memori bahwa bagian kosong dari heap yang berhasil menggunakan kembali ke sistem operasi. Interval di mana hal ini tidak dijamin dan tidak dapat diandalkan.
Memori dalam Unity
kustomisasi allokator memori