WebGL
perilaku Cache di WebGL

WebGL

Kendala memori dalam Unity WebGLLogin API yang membuat grafis 2D dan 3D di browser web. Opsi build Unity WebGL memungkinkan Unity untuk mempublikasikan konten sebagai program JavaScript yang menggunakan teknologi HTML5 dan WebGL rendering API untuk menjalankan konten Unity di browser web. More info
Lihat di Glossary
dapat membatasi kompleksitas konten yang dapat Anda jalankan.

Konten WebGL berjalan di browser. Browser mengalokasikan memori di ruang memori yang dibutuhkan aplikasi Anda untuk menjalankan konten Anda. Jumlah memori yang tersedia bervariasi tergantung pada:

  • Perangkat mana yang Anda gunakan
  • Sistem operasi mana yang Anda gunakan
  • browser mana yang Anda gunakan, dan apakah itu berjalan pada prosesor 32 atau 64
  • Berapa banyak memori mesin JavaScript browser perlu membuat kode Anda
  • Apakah browser menggunakan proses terpisah untuk setiap tab, atau konten Anda perlu berbagi ruang memori dengan semua tab terbuka lainnya.

Ada beberapa daerah di mana konten Unity WebGL membutuhkan browser untuk mengalokasikan jumlah memori yang signifikan.

Unity heap

Unity menggunakan heap memori untuk menyimpan semua benda runtime mesin Unity. Ini termasuk benda yang dikelola dan asli, aset yang dimuat, 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 shadersProgram yang berjalan di GPU. More info
Lihat di Glossary
. Ini seperti memori yang digunakan pemain Unity pada platform lain.

The Unity heap adalah blok terus-menerus dari memori yang dialokasikan. Unity mendukung resizing otomatis untuk heap sesuai dengan kebutuhan aplikasi. Ukuran heap memperluas sebagai aplikasi berjalan, dan dapat memperluas hingga 2GB. Unity menciptakan heap memori ini sebagai objek memori. Properti penyangga objek memori adalah ArrayBuffer yang dapat disesuaikan yang memegang ketepatan baku memori yang diakses oleh kode WebAssembly.

Resizing otomatis heap dapat menyebabkan aplikasi Anda crash jika browser gagal untuk mengalokasikan blok memori yang terus-menerus di ruang alamat. Untuk alasan ini, penting untuk menjaga ukuran heap Unity sekecil mungkin. Oleh karena itu, berhati-hati ketika Anda merencanakan penggunaan memori aplikasi Anda. Jika Anda ingin menguji ukuran heap Unity Anda, Anda dapat menggunakan 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
untuk profil isi blok memori.

Anda dapat mengontrol ukuran awal dan pertumbuhan heap oleh opsi pertumbuhan memori di Pengaturan WebGL. Opsi default dikonfigurasi untuk bekerja dengan baik untuk semua kasus penggunaan desktop. Namun, untuk peramban seluler Anda perlu menggunakan opsi tuning canggih. Untuk peramban seluler, disarankan untuk mengkonfigurasi Initial Memory Size ke penggunaan heap khas aplikasi.

Data Aset

Ketika Anda membuat build Unity WebGL, Unity menghasilkan file .data. Ini berisi semua Adegan dan Aset kebutuhan aplikasi untuk diluncurkan. Karena Unity WebGL tidak memiliki akses ke sistem file nyata, itu menciptakan sistem file memori virtual, dan browser membongkar file .data di sini. Kerangka emscipten (JavaScript) mengalokasikan sistem file memori ini di ruang memori browser. Meskipun konten Anda berjalan, memori browser menjaga data yang tidak terkompresi. Untuk menyimpan waktu unduhan dan penggunaan memori rendah, cobalah untuk menyimpan data yang tidak terkompresi ini sekecil mungkin.

Untuk mengurangi penggunaan memori, Anda dapat mengemas data Aset Anda ke AssetBundles. AsetBundles memungkinkan Anda kontrol penuh atas Anda Unduhan aset. Ini berarti bahwa Anda dapat mengontrol ketika aplikasi Anda mengunduh Aset, dan ketika runtime membongkarnya. Unloading aset yang tidak digunakan bebas memori.

AsetBundles download langsung ke tumpukan Unity, sehingga ini tidak mengakibatkan alokasi ekstra oleh browser.

Aktifkan Data Caching untuk secara otomatis cache data Aset di konten Anda pada mesin pengguna. Ini berarti Anda tidak perlu mengunduh ulang data selama berjalan nanti. The Unity WebGL loader menerapkan Data Caching dengan API IndexedDB. Opsi ini memungkinkan Anda untuk menyimpan file yang terlalu besar untuk browser untuk cache secara asli.

Data caching memungkinkan browser untuk menyimpan data aplikasi pada mesin pengguna. Browser sering membatasi jumlah yang dapat Anda simpan di cache mereka dan ukuran file maksimum yang dapat di cache. Ini sering tidak cukup untuk aplikasi untuk berjalan lancar. Oleh karena itu Pemuat WebGL Unity menerapkan Tanggal Caching dengan API IndexedDB. Alih-alih menyimpan konten di cache browser, Unity menyimpan data di IndexedDB.

Untuk mengaktifkan opsi Data Caching pergi ke File > Build Settings > Player Settings > Publishing Settings.

Datasheet

Server Anda dapat memancarkan header HTTP Large-Allocation untuk konten Anda. Ini memberi tahu browser yang didukung (saat ini hanya Mozilla Firefox) tentang kebutuhan memori Anda. Informasi ini memungkinkan browser yang didukung untuk menahan proses baru menggunakan ruang memori yang tidak terfragmented. Peramban juga dapat melakukan perawat tambahan untuk memastikan alokasi besar berhasil. Ini dapat memecahkan masalah di mana browser keluar dari memori ketika mencoba mengalokasikan tumpukan Unity. Ini sangat penting pada browser 32-bit.

Pertimbangan pengumpulan sampah

Koleksi sampah adalah proses penempatan dan membebaskan memori yang tidak digunakan. Setelah kolektor garbage mengumpulkan memori yang tidak digunakan di dalam tumpukan Unity.

Untuk gambaran tentang bagaimana koleksi garbage Unity bekerja, lihat Manajemen Memori Otomatis. Koleksi sampah WebGL berjalan ketika tumpukan kosong. Tumpukan adalah bagian dari tumpukan Unity tetapi bukan tumpahkan itu sendiri. Ini biasanya terjadi setelah setiap bingkai. Ini berbeda dari proses pengumpulan sampah di platform lain, di mana kolektor menghentikan semua benang berjalan sehingga dapat memeriksa tumpukan. Ini tidak mungkin dalam JavaScript. Anda dapat debug proses pengumpulan sampah menggunakan Unity Profiler.

Di sebagian besar platform lain mengumpulkan sampah semua menjalankan benang. Pengumpul sampah kemudian akan memeriksa tumpukan dan mendaftar untuk referensi objek yang dimuat. Ini tidak mungkin dalam JavaScript. Untuk alasan ini, kolektor sampah hanya akan berjalan dalam WebGL dalam situasi di mana tumpukan kosong. Ini saat ini terjadi setelah setiap bingkai.

Karena ini, kode berikut akan gagal berjalan di WebGL. Ini karena kolektor tidak mendapatkan kesempatan untuk menjalankan kolektor sampah antara iterasi loop. Ini berarti kolektor sampah tidak dapat membebaskan memori yang objek string perantara digunakan, dan kemungkinan untuk keluar dari memori di tumpukan Unity.

string hugeString = "";
 
for (int i = 0; i < 100000; i++)
 
{
 
  hugeString += "foo";
 
} 

diperbarui WebGL loader diperkenalkan pada 2020.1

WebGL
perilaku Cache di WebGL