Tingkatkan kinerja

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Halaman ini menjelaskan masalah kinerja umum dan praktik terbaik untuk mengatasinya.

Pengkalkulan script

Operasi mahal dalam kode Luau membutuhkan lebih lama untuk diproses dan dapat mempengaruhi tingkat frame.Kecuali dieksekusi secara paralel, kode Luau dijalankan secara sinkron dan memblokir thread utama sampai menemukan fungsi yang menghasilkan thread.

Masalah umum

  • Operasi intensif pada struktur tabel - Operasi kompleks seperti serialisasi, deserialisasi, dan klonan mendalam menghasilkan biaya kinerja tinggi, terutama pada struktur tabel besarIni terutama berlaku jika operasi ini rekursif atau melibatkan iterasi atas struktur data yang sangat besar

  • Acara frekuensi tinggi - Mengikat operasi mahal ke acara berbasis frame dari RunService tanpa membatasi frekuensi artinya operasi ini diulang setiap frame, yang sering menyebabkan peningkatan tidak perlu dalam waktu komputasi.Peristiwa ini termasuk:

Penangkahan

  • Memanggil kode pada RunService peristiwa secara hemat, membatasi penggunaan untuk kasus di mana invokasi frekuensi tinggi diperlukan (misalnya, memperbarui kamera).Anda dapat mengeksekusi sebagian besar kode lain di acara lain atau kurang sering dalam satu loop.
  • Hancurkan tugas besar atau mahal menggunakan task.wait() untuk menyebarkan pekerjaan di beberapa frame.
  • Identifikasi dan optimalkan operasi yang tidak perlu mahal dan gunakan multithreading untuk tugas yang kompleks secara komputasional yang tidak perlu mengakses model data.
  • Beberapa skrip sisi server dapat mengambil manfaat dari pembuatan kode asli, bendera sederhana yang mengompilasi skrip ke kode mesin daripada bytecode.

Scope MicroProfiler

ScopeKalkulasi terkait
RunService.PreRenderKode dieksekusi pada acara PreRender
RunService.PreSimulationKode dieksekusi pada peristiwa Stepped
RunService.PostSimulationKode dieksekusi pada acara Heartbeat
Jalankan Layanan.HeartbeatKode dieksekusi pada acara Heartbeat

Untuk informasi lebih lanjut tentang debugging skrip menggunakan MicroProfiler, lihat perpustakaan debug , yang berisi fungsi untuk menandai kode tertentu dan meningkatkan spesifikasi lebih lanjut, seperti debug.profilebegin dan debug.profileend .Banyak metode API Roblox yang dipanggil oleh skrip juga memiliki tag MicroProfiler terkait sendiri yang dapat memberikan sinyal berguna.

Penggunaan memori script

Bocoran memori dapat terjadi ketika Anda menulis skrip yang mengkonsumsi memori yang tidak dapat dilepaskan dengan benar oleh pengumpul sampah ketika tidak lagi digunakan.Kebocoran secara khusus menyebar di server, karena mereka dapat terus online selama banyak hari, sementara sesi klien jauh lebih pendek

Nilai memori berikut di Konsol Pengembang dapat menunjukkan masalah yang perlu diteliti lebih lanjut:

  • LuaHeap - Konsumsi tinggi atau meningkat menunjukkan kebocoran memori.
  • InstanceCount - Secara konsisten meningkatnya jumlah instans menunjukkan referensi ke beberapa instans dalam kode Anda tidak dikumpulkan sampah.
  • Memori Skrip Tempat - Memberikan skrip dengan pemecahan skrip penggunaan memori.

Masalah umum

  • Meninggalkan koneksi terhubung - Mesin tidak pernah mengumpulkan sampah acara yang terhubung ke instans dan setiap nilai yang disebutkan di dalam panggilan balik terhubung.Oleh karena itu, koneksi aktif acara dan kode di dalam instans terhubung, fungsi terhubung, dan nilai referensi, berada di luar cakupan pengumpul sampah memori, bahkan setelah peristiwa ditembakkan.

    Meskipun acara terputus ketika instansi yang mereka miliki hancur, kesalahan umum adalah menganggap ini berlaku untuk objek Player .Setelah pengguna meninggalkan pengalaman, mesin tidak secara otomatis menghancurkan objek dan model karakter perwakilan mereka , sehingga koneksi ke objek dan instansi di bawah model karakter, seperti , masih mengkonsumsi memori jika Anda tidak memutuskannya di skrip.Ini dapat menyebabkan kebocoran memori yang sangat signifikan dari waktu ke waktu di server ketika ratusan pengguna bergabung dan meninggalkan pengalaman.

  • Tabel - Menyisipkan objek ke dalam tabel tetapi tidak menghapusnya saat mereka tidak lagi dibutuhkan menyebabkan konsumsi memori yang tidak perlu, terutama untuk tabel yang melacak data pengguna saat mereka bergabungMisalnya, sampel kode berikut membuat tabel yang menambahkan informasi pengguna setiap kali pengguna bergabung:

    Misalnya

    local playerInfo = {}
    Players.PlayerAdded:Connect(function(player)
    playerInfo[player] = {} -- beberapa info
    end)

    Jika Anda tidak menghapus entri ini ketika tidak lagi dibutuhkan, tabel terus tumbuh dalam ukuran dan mengkonsumsi lebih banyak memori saat lebih banyak pengguna bergabung dengan sesi.Kode apa pun yang berulang di atas tabel ini juga menjadi lebih mahal secara komputasional saat tabel tumbuh dalam ukuran.

Penangkahan

Untuk membersihkan semua nilai yang digunakan untuk mencegah bocoran memori:

  • Putuskan semua koneksi - Pergi melalui basis kode Anda pastikan setiap koneksi dibersihkan melalui salah satu jalur berikut:

    • Memutus secara manual menggunakan fungsi Disconnect().
    • Menghancurkan instansi yang dimiliki oleh acara dengan fungsi Destroy().
    • Menghancurkan objek skrip yang jejak koneksinya kembali ke.
  • Hapus objek dan karakter pemain setelah meninggalkan - Terapkan kode untuk memastikan tidak ada koneksi yang bertahan setelah pengguna meninggalkan, seperti dalam contoh berikut:

    Misalnya

    Players.PlayerAdded:Connect(function(player)
    player.CharacterRemoving:Connect(function(character)
    task.defer(character.Destroy, character)
    end)
    end)
    Players.PlayerRemoving:Connect(function(player)
    task.defer(player.Destroy, player)
    end)

Kalkulasi fisika

Simulasi fisika berlebihan dapat menjadi penyebab utama peningkatan waktu komputasi per frame di server dan klien.

Masalah umum

  • Frekuensi langkah fisika berlebih - Secara default, perilaku melangkah berada di mode adaptif , di mana langkah fisika pada 60 Hz, 120 Hz, atau 240 Hz, tergantung pada kompleksitas mekanisme fisika.

    Mode tetap dengan akurasi fisika yang ditingkatkan juga tersedia, yang memaksa semua assemblasi fisika untuk bergerak pada 240 Hz (empat kali per frame).Ini menghasilkan lebih banyak perhitungan setiap frame.

  • Jumlah kompleksitas simulasi objek yang berlebihan - Semakin banyak 3D assemblies yang disimulasikan, semakin lama perhitungan fisika mengambil tiap frame.Seringkali, pengalaman akan memiliki objek yang disimulasikan yang tidak perlu atau akan memiliki mekanisme yang memiliki lebih banyak batasan dan persambungan daripada yang mereka butuhkan.

  • Deteksi tabrakan yang terlalu akurat - Bagian mesh memiliki properti CollisionFidelity untuk mendeteksi tabrakan yang menawarkan berbagai mode dengan berbagai tingkat dampak kinerja.Mode deteksi tabrakan yang tepat untuk bagian mesh memiliki biaya kinerja paling mahal dan membutuhkan waktu lebih lama untuk menghitung mesin.

Penangkahan

  • Bagian pengait yang tidak memerlukan simulasi - Pengait semua bagian yang tidak perlu dipengaruhi oleh fisika, seperti untuk NPC statis.

  • Gunakan langkah fisika adaptif - Langkah adaptif secara dinamis menyesuaikan tingkat perhitungan fisika untuk mekanisme fisika, memungkinkan pembaruan fisika dilakukan lebih jarang dalam beberapa kasus.

  • Kurangkan kompleksitas mekanisme * Jika memungkinkan, minimalkan jumlah batasan fisika atau persambungan dalam sebuah kumpulan.

    • Kurangi jumlah tabrakan diri dalam mekanisme, seperti dengan menerapkan batas atau batasan tidak tabrakan ke anggota ragdoll untuk mencegah mereka bertabrakan satu sama lain.
  • Kurangi penggunaan akurasi tabrakan presisi untuk meshes * Untuk objek kecil atau tidak interaktif di mana pengguna jarang memperhatikan perbedaan, gunakan kesetiaan kotak.

    • Untuk objek ukuran kecil hingga sedang, gunakan kotak atau keandalan hull, tergantung pada bentuk.

    • Untuk objek besar dan sangat kompleks, buat tabrakan khusus menggunakan bagian tak terlihat saat memungkinkan

    • Untuk objek yang tidak memerlukan tabrakan, nonaktifkan tabrakan dan gunakan keandalan kotak atau hull, karena geometri tabrakan masih disimpan di memori.

    • Anda dapat menampilkan geometri tabrakan untuk tujuan debug di Studio dengan menyalakan keandalan tabrakan dari widget Opsi Visualisasi di sudut kanan atas tampilan 3D.

      Alternatifnya, Anda dapat menerapkan filter CollisionFidelity = Precise ke Explorer yang menunjukkan jumlah semua bagian mesh dengan ketepatan yang tepat dan memungkinkan Anda dengan mudah memilihnya.

    • Untuk panduan mendalam tentang cara memilih opsi keandalan kolisi yang seimbang dengan persyaratan akurasi dan kinerja Anda, lihat Atur Parametrik Fisika dan Rendering.

Scope MicroProfiler

ScopeKalkulasi terkait
physicsSteppedPerhitungan fisika keseluruhan
langkah duniaLangkah fisika diskrit yang diambil setiap frame

Penggunaan memori fisik

Gerakan fisik dan deteksi tabrakan mengkonsumsi memori.Bagian mesh memiliki properti CollisionFidelity yang menentukan pendekatan yang digunakan untuk mengevaluasi batas tabrakan mesh.

Permasalahan umum

Mode deteksi tabrakan default dan akurat mengkonsumsi memori lebih banyak daripada dua mode lain dengan bentuk tabrakan kesetiaan yang lebih rendah.

Jika Anda melihat tingkat konsumsi memori yang tinggi di bawah PhysicsParts , Anda mungkin perlu menjelajahi pengurangan keandalan kolisi dari objek dalam pengalaman Anda.

Cara mengatasi

Untuk mengurangi memori yang digunakan untuk keandalan tabrak:

  • Untuk bagian yang tidak membutuhkan tabrakan, nonaktifkan tabrakan mereka dengan mengatur BasePart.CanCollide , BasePart.CanTouch dan BasePart.CanQuery ke false .
  • Kurangi ketepatan tabrakan menggunakan pengaturan CollisionFidelity. Box memiliki overhead memori terendah, dan Default dan Precise umumnya lebih mahal.
    • Umumnya aman untuk menetapkan keandalan tabrakan bagian terikat kecil apa pun ke Box .
    • Untuk meshes besar yang sangat kompleks, Anda mungkin ingin membangun meshes tabrakan Anda sendiri dari objek yang lebih kecil dengan keakuratan tabrakan kotak.

Manusiawi

Humanoid adalah kelas yang menyediakan berbagai fungsi untuk karakter pemain dan non pemain (NPC).Meskipun kuat, Humanoid datang dengan biaya perhitungan yang signifikan.

Masalah umum

  • Meninggalkan semua HumanoidStateTypes diaktifkan pada NPC - Ada biaya kinerja untuk meninggalkan beberapa HumanoidStateTypes diaktifkan.Nonaktifkan semua yang tidak diperlukan untuk NPC Anda.Sebagai contoh, kecuali NPC Anda akan memanjat tangga, aman untuk menonaktifkan status Climbing.
  • Menginstanisasi, memodifikasi, dan menghidupkan kembali model dengan Humanoids sering * Ini bisa intensif bagi mesin untuk diproses, terutama jika model ini menggunakan pakaian berlapis .Ini juga bisa menjadi sangat bermasalah dalam pengalaman di mana avatar sering respawn.
    • Di dalam MicroProfiler , tag panjang updateInvalidatedFastClusters (lebih dari 4 ms) seringkali merupakan sinyal bahwa instansiasi/modifikasi avatar memicu validasi berlebihan.
  • Menggunakan Humanoid di kasus di mana mereka tidak diperlukan - NPC statis yang tidak bergerak umumnya tidak membutuhkan kelas Humanoid.
  • Memutar animasi pada banyak NPC dari server - Animasi NPC yang dijalankan di server perlu disimulasikan di server dan direplikasi ke klien.Ini bisa menjadi biaya tambahan yang tidak perlu.

Penangkahan

  • Mainkan animasi NPC di klien - Dalam pengalaman dengan banyak NPC, pertimbangkan untuk membuat Animator di klien dan menjalankan animasi secara lokal.Ini mengurangi beban di server dan kebutuhan untuk replikasi yang tidak perlu.Ini juga membuat optimisasi tambahan menjadi mungkin (seperti hanya memutar animasi untuk NPC yang berada dekat dengan karakter).
  • Gunakan alternatif ramah kinerja untuk Humanoids - Model NPC tidak harus mengandung objek humanoid.
    • Untuk NPC statis, gunakan AnimationController sederhana, karena mereka tidak perlu bergerak tetapi hanya perlu memainkan animasi
    • Untuk memindahkan NPC, pertimbangkan untuk menerapkan kontrol gerakan Anda sendiri dan menggunakan AnimationController untuk animasi, tergantung pada kompleksitas NPC Anda
  • Nonaktifkan status humanoid yang tidak digunakan - Gunakan Humanoid:SetStateEnabled() untuk hanya mengaktifkan status yang diperlukan untuk setiap humanoid
  • Model NPC kolam dengan sering respawning - Alih-alih menghancurkan NPC sepenuhnya, kirim NPC ke kolam NPC yang tidak aktif.Dengan cara ini, ketika NPC baru diperlukan untuk respawn, Anda hanya dapat mengaktifkan kembali salah satu NPC dari kolam.Proses ini disebut pooling, yang meminimalisir jumlah kali karakter perlu diinstansikan.
  • Hanya menelurkan NPC saat pengguna berada di dekatnya - Jangan menelurkan NPC saat pengguna tidak berada dalam jangkauan, dan hilangkan mereka saat pengguna meninggalkan jangkauannya.
  • Hindari membuat perubahan pada hierarki avatar setelah diinstansikan - Beberapa modifikasi pada hierarki avatar memiliki implikasi kinerja yang signifikan.Beberapa optimisasi tersedia:
    • Untuk animasi prosedural khusus, jangan perbarui properti JointInstance.C0 dan JointInstance.C1 . Sebagai gantinya, perbarui properti Motor6D.Transform .
    • Jika Anda perlu menempelkan objek BasePart apa pun ke avatar, lakukan di luar hierarki avatar Model .

Scope MicroProfiler

ScopeKalkulasi terkait
stepHumanoidKontrol dan fisika humanoid
langkahAnimasiAnimasi humanoid dan animator
perbarui cluster cepat tidak validTerkait dengan instansiasi atau modifikasi avatar

Rendering

Sebagian besar waktu yang dihabiskan klien untuk setiap frame adalah untuk menyajikan adegan di frame saat ini.Server tidak melakukan rendering apa pun, sehingga bagian ini eksklusif untuk klien.

Tarik panggilan

Sebuah panggilan serah adalah serangkaian instruksi dari mesin ke GPU untuk menampilkan sesuatuPanggilan menggambar memiliki biaya overhead yang besar.Secara umum, semakin sedikit panggilan seret per frame, semakin sedikit waktu komputasi yang dihabiskan untuk menyajikan frame.

Anda dapat melihat berapa banyak panggilan menggambar yang saat ini terjadi dengan item Statistik Render > Waktu di StudioAnda dapat melihat Statistik Render di klien dengan menekan .

Semakin banyak objek yang perlu ditarik di adegan Anda dalam frame tertentu, semakin banyak panggilan menggambar yang dilakukan ke GPU.Namun, Mesin Roblox menggunakan proses yang disebut instansiasi untuk melipatgandakan meshes identik dengan karakteristik tekstur yang sama ke dalam satu panggilan menggambar.Secara khusus, beberapa meshes dengan sama MeshId di tangani dalam satu panggilan menggambar ketika:

Masalah umum lainnya

  • Konsentrasi objek berlebih - Jika banyak objek terkonsentrasi dengan konsentrasi tinggi, maka rendering area adegan ini membutuhkan lebih banyak panggilan gambar.Jika Anda menemukan tingkat bingkai Anda turun saat melihat bagian tertentu dari peta, ini bisa menjadi sinyal yang baik bahwa kepadatan objek di daerah ini terlalu tinggi.

    Objek seperti stiker, teks, dan partikel tidak batch dengan baik dan memperkenalkan panggilan menggambar tambahan.Berikan perhatian ekstra pada jenis objek ini dalam adegan.Secara khusus, perubahan properti ke ParticleEmitters dapat memiliki dampak dramatis pada kinerja.

  • Peluang Instansi Terlewatkan - Seringkali, adegan akan mencakup mesh yang sama diulang beberapa kali, tetapi setiap salinan mesh memiliki ID aset mesh atau tekstur yang berbedaIni mencegah instansi dan dapat menyebabkan panggilan tarik yang tidak perlu.

    Penyebab umum dari masalah ini adalah ketika seluruh adegan diimpor sekaligus, bukan aset individu yang diimpor ke Roblox dan kemudian diulang setelah diimpor untuk mengumpulkan adegan.

  • Kompleksitas objek berlebih - Meskipun tidak sepenting jumlah panggilan serah, jumlah segi di sebuah adegan mempengaruhi berapa lama waktu yang dibutuhkan untuk menampilkan frame.Adegan dengan jumlah mesh yang sangat besar dan sangat kompleks adalah masalah umum, seperti adegan dengan set properti MeshPart.RenderFidelity ke Enum.RenderFidelity.Precise pada terlalu banyak mesh.

  • Pencastan bayangan berlebihan - Penanganan bayangan adalah proses mahal, dan peta yang berisi jumlah dan kepadatan cahaya yang tinggi yang melemparkan bayangan (atau jumlah dan kepadatan bagian kecil yang dipengaruhi oleh bayangan) kemungkinan memiliki masalah kinerja.

  • Penarikan transparansi tinggi - Menempatkan objek dengan transparansi parsial di dekat satu sama lain memaksa mesin untuk menampilkan piksel yang tumpang tindih berkali-kali, yang dapat mempengaruhi performa.Untuk informasi lebih lanjut tentang mengidentifikasi dan memperbaiki masalah ini, lihat Hapus Transparansi Berlapis.

Penangkahan

  • Menginstansi meshes identik dan mengurangi jumlah meshes unik - Jika Anda memastikan semua meshes identik memiliki ID aset dasar yang sama, mesin dapat mengenali dan menampilkannya dalam satu panggilan menggambar.Pastikan untuk hanya mengunggah setiap meshes di peta sekali dan kemudian menyalinnya di Studio untuk digunakan kembali daripada mengimpor peta besar secara keseluruhan, yang dapat menyebabkan meshes identik memiliki ID konten terpisah dan diakui sebagai aset unik oleh mesin.Paket adalah mekanisme berguna untuk penggunaan ulang objek.
  • Penyaringan - Penyaringan menggambarkan proses menghapus panggilan serah untuk objek yang tidak masuk ke dalam frame terakhir yang drender.Secara default, mesin melewati panggilan menggambar untuk objek di luar bidang pandang kamera (pemilihan frustum), tetapi tidak melewati panggilan menggambar untuk objek yang terhalang dari pandangan oleh objek lain (pemilihan penghalangan).Jika adegan Anda memiliki banyak panggilan serah, pertimbangkan untuk menerapkan penyaringan tambahan sendiri saat runtime secara dinamis untuk setiap frame, seperti menerapkan strategi umum berikut:
    • Sembunyikan MeshPart dan BasePart yang berada jauh dari kamera atau pengaturan
    • Untuk lingkungan dalam ruangan, implementasikan sistem ruang atau portal yang menyembunyikan objek yang saat ini tidak ditempati oleh pengguna mana pun.
  • Mengurangi ketepatan rendering - Tetapkan ketepatan rendering ke Otomatis atau Kinerja .Ini memungkinkan meshes untuk kembali ke alternatif yang kurang kompleks, yang dapat mengurangi jumlah poligon yang perlu ditarik.
  • Menonaktifkan pencastan bayangan pada bagian dan objek cahaya yang tepat - Kompleksitas bayangan dalam adegan dapat dikurangi dengan menonaktifkan secara selektif properti pencastan bayangan pada objek cahaya dan bagian.Ini dapat dilakukan saat mengedit atau dinamis saat menjalankan.Beberapa contohnya adalah:
    • Gunakan properti BasePart.CastShadow untuk menonaktifkan pencitraan bayangan pada bagian kecil di mana bayangan tidak mungkin terlihat.Ini bisa sangat efektif ketika hanya diterapkan ke bagian yang jauh dari kamera pengguna.

    • Nonaktifkan bayangan pada objek bergerak saat memungkinkan.

    • Nonaktifkan Light.Shadows pada instans ringan di mana objek tidak perlu melempar bayangan.

    • Membatasi jangkauan dan sudut instansi cahaya.

    • Gunakan lebih sedikit instansi ringan.

Scope MicroProfiler

ScopeKalkulasi terkait
Siapkan dan LakukanRendering keseluruhan
Lakukan/Adegan/ computeLightingPerformPembaruan grid cahaya dan bayangan
LightGrid CPUPembaruan grid cahaya Voxel
Sistem Peta BayanganPemetaan bayangan
Lakukan/Adegan/UpdateViewPersiapan untuk rendering dan update partikel
Lakukan/Adegan/RenderViewRendering dan pengolahan pasca

Jaringan dan replikasi

Jaringan dan replikasi menggambarkan proses dimana data dikirim antara server dan klien yang terhubung.Informasi dikirim antara klien dan server setiap frame, tetapi jumlah informasi yang lebih besar membutuhkan lebih banyak waktu komputasi.

Masalah umum

  • Lalu lintas remote berlebihan - Mengirim banyak data melalui RemoteEvent atau RemoteFunction atau memanggilnya sangat sering dapat menyebabkan banyak waktu CPU yang dihabiskan untuk memproses paket masuk setiap frame.Kesalahan umum meliputi:

    • Mengulangi data setiap frame yang tidak perlu disalin ulang.
    • Mengulangi data pada input pengguna tanpa mekanisme untuk membatasnya.
    • Mengirim lebih banyak data daripada yang dibutuhkan.Sebagai contoh, mengirim seluruh inventaris pemain saat mereka membeli barang daripada hanya rincian barang yang dibeli.
  • Penciptaan atau penghapusan pohon instansi kompleks - Ketika perubahan dilakukan pada model data di server, itu direplikasi ke klien yang terhubung.Ini berarti menciptakan dan menghancurkan hierarki instans besar seperti peta pada saat eksekusi bisa sangat intensif jaringan

    Penyalah biasa di sini adalah data animasi kompleks yang disimpan oleh plugin Editor Animasi di rig.Jika ini tidak dihapus sebelum permainan dipublikasikan dan model animasi diklon secara teratur, akan ada banyak data yang tidak perlu diulang.

  • Layanan Tween di Sisi Server - Jika TweenService digunakan untuk menampilkan objek sisi server, properti yang ditampilkan disalin ke setiap klien setiap frame.Tidak hanya ini menyebabkan remaja gelisah karena latensi klien berfluktuasi, tetapi menyebabkan banyak lalu lintas jaringan yang tidak perlu.

Penangkahan

Anda dapat menggunakan taktik berikut untuk mengurangi replikasi yang tidak perlu:

  • Hindari mengirim banyak data sekaligus melalui acara jarak jauh .Sebagai gantinya, hanya kirim data yang diperlukan pada frekuensi yang lebih rendahSebagai contoh, untuk status karakter, salin saat berubah daripada setiap frame.
  • Memotong pohon instansi kompleks seperti peta dan memuatnya dalam potongan untuk mendistribusikan pekerjaan mereplikasi ini di beberapa frame.
  • Bersihkan metadata animasi , terutama direktori animasi rig, setelah diimpor
  • Batasi replikasi instansi tidak perlu , terutama dalam kasus di mana server tidak perlu memiliki pengetahuan tentang instansi yang dibuat.Ini mencakup:
    • Efek visual seperti ledakan atau serangan mantra sihir.Server hanya perlu tahu lokasi untuk menentukan hasilnya, sementara klien dapat membuat visual secara lokal.
    • Model pandangan item orang pertama.
    • Objek tween di klien daripada server.

Scope MicroProfiler

ScopeKalkulasi terkait
Paket ProsesMemproses paket jaringan masuk, seperti invokasi acara dan perubahan properti
Menyediakan Bandwidth dan Menjalankan PengirimPeristiwa keluaran yang relevan di server

Penggunaan memori aktif

Mekanisme dampak tertinggi yang tersedia untuk pencipta untuk meningkatkan penggunaan memori klien adalah mengaktifkan Streaming Instansi.

Streaming instan

streaming instansial memuat secara selektif bagian model data yang tidak diperlukan, yang dapat mengurangi waktu beban secara signifikan dan meningkatkan kemampuan klien untuk mencegah kesalahan saat berada di bawah tekanan memori.

Jika Anda mengalami masalah memori dan streaming instansi dinonaktifkan, pertimbangkan untuk memperbarui pengalaman Anda untuk mendukungnya, terutama jika dunia 3D Anda besar.Streaming instansi didasarkan pada jarak di ruang 3D, jadi dunia yang lebih besar secara alami lebih banyak mendapat manfaat darinya

Jika streaming instansi diaktifkan, Anda dapat meningkatkan agresivitasnya. Misalnya, pertimbangkan:

  • Mengurangi penggunaan persisten Integritas Streaming .
  • Mengurangi radius streaming .

Untuk informasi lebih lanjut tentang opsi streaming dan manfaatnya, lihat Properti streaming.

Masalah umum lainnya

  • Duplikasi aset - Kesalahan umum adalah mengunggah aset yang sama beberapa kali dengan hasil berbeda ID aset.Ini dapat menyebabkan konten yang sama dimuat ke dalam memori beberapa kali.
  • Volume aset berlebih - Bahkan ketika aset tidak identik, ada kasus ketika peluang untuk menggunakan kembali aset yang sama dan menghemat memori terlewatkan.
  • File audio - File audio dapat menjadi kontributor mengejutkan untuk penggunaan memori, terutama jika Anda memuat semuanya ke klien sekaligus daripada hanya memuat apa yang Anda butuhkan untuk sebagian dari pengalaman.Untuk strategi, lihat Waktu Load.
  • Teks beresolusi tinggi - Konsumsi memori grafis untuk sebuah teks tidak terkait dengan ukuran teks di disk, tetapi lebih dari jumlah piksel di teks.
    • Sebagai contoh, tekstur piksel 1024x1024 mengkonsumsi empat kali memori grafis dari tekstur 512x512.
    • Gambar yang diunggah ke Roblox diterjemahkan ke format tetap, sehingga tidak ada manfaat memori untuk mengunggah gambar dalam model warna yang terkait dengan lebih sedikit bit per piksel.Demikian pula, mengompres gambar sebelum mengunggah atau menghapus saluran alfa dari gambar yang tidak membutuhkannya dapat mengurangi ukuran gambar di disk, tetapi tidak meningkatkan atau hanya sedikit meningkatkan penggunaan memori.Meskipun mesin secara otomatis menurunkan resolusi tekstur pada beberapa perangkat, tingkat penurunan tergantung pada karakteristik perangkat, dan resolusi tekstur berlebih masih dapat menyebabkan masalah.
    • Anda dapat mengidentifikasi konsumsi memori grafis untuk tekstur tertentu dengan memperluas kategori GrafikTexture di Konsol Pengembang .

Penangkahan

  • Hanya mengunggah aset sekali - Gunakan kembali ID aset yang sama di antara objek dan pastikan aset yang sama, terutama mesh dan gambar, tidak diunggah secara terpisah berkali-kali.
  • Temukan dan perbaiki aset duplikat - Carilah bagian dan tekstur mesh identik yang diunggah beberapa kali dengan ID yang berbeda.
    • Meskipun tidak ada API untuk mendeteksi kesamaan aset secara otomatis, Anda dapat mengumpulkan semua ID aset gambar di tempat Anda (baik secara manual atau dengan skrip), download mereka, dan bandingkan mereka menggunakan alat perbandingan eksternal.
    • Untuk bagian mesh, strategi terbaik adalah mengambil ID mesh unik dan mengatur mereka berdasarkan ukuran untuk mengidentifikasi duplikat secara manual.
    • Alih-alih menggunakan teksur terpisah untuk warna yang berbeda, unggah satu teksur dan gunakan properti SurfaceAppearance.Color untuk menerapkan berbagai warna kepadanya.
  • Mengimpor aset di peta secara terpisah - Alih-alih mengimpor seluruh peta sekaligus, impor dan rekonstruksi aset di peta secara individual dan rekonstruksi merekaImporter 3D tidak melakukan de-duplikasi meshes, jadi jika Anda harus mengimpor peta besar dengan banyak ubin lantai terpisah, masing-masing ubin akan diimpor sebagai aset terpisah (walaupun itu duplikat).Ini dapat menyebabkan masalah kinerja dan memori di sepanjang garis, karena setiap mesh diperlakukan secara individual dan mengambil memori dan memanggil panggilan.
  • Batasi piksel gambar untuk tidak lebih dari jumlah yang diperlukanKecuali jika gambar mengisi banyak ruang fisik di layar, biasanya membutuhkan maksimal 512x512 piksel.Sebagian besar gambar kecil harus lebih kecil dari 256x256 piksel
  • Gunakan Lembar Pemotong untuk memastikan penggunaan ulang tekstur maksimal di peta 3D.Untuk langkah dan contoh tentang cara membuat lembar pemotong, lihat Membuat Lembar Pemotong.

Waktu pemuatan

Banyak pengalaman menerapkan layar pemuatan khusus dan menggunakan metode ContentProvider:PreloadAsync() untuk meminta aset sehingga gambar, suara, dan mesh diunduh di latar belakang.

Keuntungan dari pendekatan ini adalah Anda dapat memastikan bagian penting dari pengalaman Anda sepenuhnya dimuat tanpa pop-in.Namun, kesalahan umum adalah menggunakan metode ini secara berlebihan untuk memuat lebih banyak aset daripada yang sebenarnya dibutuhkan.

Contoh praktik buruk adalah memuat seluruhWorkspace.Meskipun ini dapat mencegah pop-in tekstur, ini secara signifikan meningkatkan waktu pemuatan.

Sebagai gantinya, hanya gunakan ContentProvider:PreloadAsync() di situasi yang diperlukan, yang termasuk:

  • Gambar di layar pemuatan.
  • Gambar penting di menu pengalaman Anda, seperti latar belakang tombol dan ikon.
  • Aset penting di area mulai atau spawn.

Jika Anda harus memuat banyak aset, kami sarankan Anda menyediakan tombol Lewati Pemuatan .