Mengkompresi data mesh
Textures

Memuat tekstur dan data mesh

Unity dapat memuat tekstur dan data 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
dari disk dan mengunggahnya ke GPU dalam dua cara yang berbeda: sinkron atau asinkron. Dua proses ini disebut pipa unggah sinkron dan pipa unggah asinkron.

Ketika Unity menggunakan pipa unggah sinkron, tidak dapat melakukan tugas lain sementara beban dan mengunggah data. Ini dapat menyebabkan jeda yang terlihat dalam aplikasi Anda. Ketika Unity menggunakan pipa unggah asinkron, dapat melakukan tugas lain sementara beban dan mengunggah data di latar belakang.

Jika tekstur atau mesh memenuhi syarat untuk pipa unggah asinkron, Unity menggunakan pipa unggah asin secara otomatis. Jika tekstur atau mesh tidak bertanggung jawab untuk pipa unggah asinkron, Unity menggunakan pipa unggah sinkron secara otomatis.

How it works

Perbedaan utama antara pipa unggah sinkron dan asinkron adalah di mana Unity menyimpan data pada membangun waktu, yang mempengaruhi bagaimana Unity memuatnya pada runtime.

Dalam pipa unggah sinkron, Unity harus memuat metadata (data kepala) dan data texel atau vertex (data dasar) untuk tekstur atau mesh dalam satu bingkai. Dalam pipa unggah asinkron, Unity harus memuat hanya data header dalam satu bingkai, dan dapat merampingkan data biner ke GPU atas bingkai berikutnya.

Dalam pipa unggah sinkron:

  • Pada waktu build, Unity menulis baik header dan data biner untuk mesh atau tekstur ke file .res yang sama.
  • Pada runtime, ketika aplikasi membutuhkan tekstur atau mesh, beban Unity baik data header dan data biner untuk tekstur atau mesh dari file .res ke memori. Ketika semua data dalam memori, Unity kemudian mengunggah data biner dari memori ke GPU. Operasi pemuatan dan unggah terjadi terutama pada benang utama, dalam bingkai tunggal.

Dalam pipa unggah asinkron:

  • Pada waktu build, Unity menulis data header ke file .res dan data biner ke file .resS yang terpisah.
  • Pada runtime, ketika aplikasi membutuhkan tekstur atau mesh, Unity memuat header dari file .res ke memori. Ketika header dalam memori, Unity kemudian merampingkan data biner dari .res S file ke GPU menggunakan penyangga cincin tetap. Unity merampingkan data biner menggunakan beberapa benang, selama beberapa bingkai. Perhatikan bahwa pada beberapa platform konsol di mana Unity sudah tahu perangkat keras GPU, Unity melewatkan penyangga cincin dan beban langsung ke memori GPU.

Tekstur dan kelayakan data mesh

Tekstur memenuhi syarat untuk pipa unggah asinkron jika kondisi berikut dipenuhi:

Perhatikan bahwa jika Anda memuat tekstur menggunakan LoadImage(byte[] data), kekuatan ini Bersatu untuk menggunakan pipa unggah sinkron, bahkan jika kondisi di atas terpenuhi.

Mesh memenuhi syarat untuk pipa unggah asinkron jika kondisi berikut dipenuhi:

  • Mesh tidak membaca / menulis diaktifkan.
  • Mesh tidak di folder Sumber Daya.
  • Jaring tidak memiliki BlendShapes.
  • Unity tidak menerapkan Dynamic BatchingProses Unity otomatis yang mencoba untuk membuat beberapa jala seolah-olah mereka adalah satu mesh untuk kinerja grafis yang dioptimalkan. Teknik mengubah semua simpul GameObject pada CPU dan kelompok banyak simpul serupa bersama. More info
    Lihat di Glossary
    ke mesh, baik karena mesh tidak bertanggung jawab untuk Dynamic Batching atau karena Dynamic Batching dinonaktifkan. Untuk informasi lebih lanjut tentang Batching Dinamis, lihat Gambar batching panggilan.
  • Data simpul / indeks mesh tidak diperlukan oleh Particle SystemKomponen 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
    , TerrainPemandangan di tempat kejadian Anda. Terrain GameObject menambahkan pesawat datar besar untuk adegan Anda dan Anda dapat menggunakan jendela Inspektur Terrain untuk menciptakan lanskap rinci. More info
    Lihat di Glossary
    , atau ColliderBentuk tak terlihat yang digunakan untuk menangani tabrakan fisik untuk objek. Seorang sari tidak perlu menjadi bentuk yang sama dengan jala objek - perkiraan kasar sering lebih efisien dan tidak dapat dibedakan dalam gameplay. More info
    Lihat di Glossary
    Mesh.
  • Jaring tidak memiliki Berat tulang.
  • Mesh topologi tidak quadsObjek primitif yang menyerupai pesawat tetapi tepinya hanya satu unit panjang, hanya menggunakan 4 simpul, dan permukaan berorientasi pada pesawat XY ruang koordinat lokal. More info
    Lihat di Glossary
    .
  • meshCompression untuk aset mesh diatur ke Off. Jika target build adalah Android, kompresi LZ4 diaktifkan dalam Pengaturan Build Proyek.

Dalam semua keadaan lain, tekstur beban Unity dan jala secara serentak.

Bagaimana untuk mengidentifikasi yang meng-upload pipa Unity menggunakan

Anda dapat menggunakan alat 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
atau profil lainnya untuk mengidentifikasi ketika Unity menggunakan pipa unggah asin, dengan mengamati aktivitas benang dan profiler markersDitempatkan 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
.

Berikut ini menunjukkan bahwa Unity menggunakan pipa unggah asinkron untuk mengunggah tekstur atau jala:

  • AsyncUploadManager.ScheduleAsyncRead, AsyncReadManager.ReadFile, dan penanda profiler Async.DirectTextureLoadBegin.
  • Aktivitas pada benang AsyncRead.

Jika Anda tidak melihat aktivitas ini, maka Unity tidak menggunakan pipa unggah asinkron.

Perhatikan bahwa penanda profiler berikut tidak menunjukkan bahwa Unity menggunakan pipa unggah asinkron; Unity menyebutnya untuk memeriksa apakah setiap pekerjaan unggah asinkron perlu terjadi:

  • Initialization.AsyncUploadTimeSlicedUpdate
  • AsyncUploadManager.AsyncResourceUpload
  • AsyncUploadManager.ScheduleAsyncCommands

Mengkonfigurasi pipa unggah asinkron

Anda dapat mengkonfigurasi pengaturan ini untuk pipa unggah asinkron. Perhatikan bahwa Anda tidak dapat mengkonfigurasi pengaturan untuk pipa unggah sinkron.

The Async Upload settings in the Quality settings
Pengaturan Async Upload dalam pengaturan Kualitas

Async Unggah Buffer

Unity menggunakan penyangga cincin tunggal untuk merampingkan tekstur dan jaring data ke GPU. Ini mengurangi jumlah alokasi memori yang diperlukan.

Async Upload Buffer menentukan ukuran penyangga cincin ini dalam megabyte. Memiliki ukuran minimal 2, dan ukuran maksimum 512.

Unity secara otomatis mengubah penyangga agar sesuai dengan tekstur atau mesh terbesar yang saat ini memuat. Ini bisa menjadi operasi yang lambat, terutama jika Unity harus melakukan lebih dari sekali; misalnya, jika Anda memuat banyak tekstur yang lebih besar dari ukuran penyangga default. Untuk mengurangi jumlah kali Unity harus mengubah ukuran penyangga, set nilai ini agar sesuai dengan nilai terbesar yang Anda harapkan. Ini biasanya tekstur terbesar di 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
.

Anda dapat mengkonfigurasi nilai ini di jendela pengaturan kualitas, atau menggunakan API QualitySettings.asyncUploadBufferSize.

Async Upload Waktu Slice

Async Upload Time Slice adalah jumlah waktu CPU menghabiskan unggah tekstur atau jaring data ke GPU, dalam mili detik per bingkai.

Nilai yang lebih besar berarti data akan siap di GPU lebih cepat, tetapi CPU akan menghabiskan lebih banyak waktu pada operasi unggah selama bingkai tersebut. Perhatikan bahwa Unity hanya menggunakan waktu ini untuk meng-upload jika ada data yang menunggu dalam penyangga untuk diunggah ke GPU; jika tidak ada data yang menunggu, Unity dapat menggunakan waktu ini untuk operasi lain.

Anda dapat mengkonfigurasi nilai ini di jendela pengaturan kualitas, atau menggunakan API QualitySettings.asyncUploadTimeSlice.

Informasi lebih lanjut

Untuk informasi lebih lanjut tentang mengunggah tekstur dan data mesh secara asinkron, lihat posting blog Unity.

Mengkompresi data mesh
Textures