Pengalaman dalam streaming instan memungkinkan Roblox Engine untuk secara dinamis memuat dan melepaskan konten 3D dan instans terkait di wilayah dunia.Ini dapat meningkatkan pengalaman pemain secara keseluruhan dalam beberapa cara, misalnya:
- Waktu bergabung lebih cepat — Pemain dapat mulai bermain di satu bagian dunia sementara lebih banyak dunia dimuat di latar belakang.
- Efisiensi memori — Pengalaman dapat dimainkan di perangkat dengan memori lebih sedikit karena konten diputar secara dinamis masuk dan keluar.Dunia yang lebih imersif dan terperinci dapat dimainkan pada rentang perangkat yang lebih luas.
- Peningkatan kinerja — Tingkat frame dan pelaksanaanyang lebih baik, karena server dapat menghabiskan lebih sedikit waktu dan bandwidth untuk menyinkronkan perubahan antara dunia dan pemain di dalamnya.Klien menghabiskan lebih sedikit waktu untuk memperbarui instansi yang saat ini tidak relevan dengan pemain.
- Tingkat rincian — Model jauh dan medan tetap terlihat bahkan ketika tidak diputar ke klien, menjaga pengalaman dioptimalkan tanpa sepenuhnya mengorbankan visual latar belakang.
Aktifkan streaming
streaming instansi diaktifkan melalui properti StreamingEnabled dari objek Ruang kerja di Studio.Properti ini tidak dapat ditetapkan dalam skrip.Streaming diaktifkan secara default untuk tempat baru yang dibuat di Studio.

Setelah diaktifkan, disarankan agar Anda mematuhi praktik berikut:
- Karena klien biasanya tidak akan memiliki seluruh Workspace tersedia secara lokal, gunakan alat/API yang tepat untuk memastikan instans ada sebelum mencoba mengaksesnya di LocalScript .Sebagai contoh, gunakan kontrol streaming per model , mendeteksi streaming instansi , atau gunakan WaitForChild() pada objek yang mungkin tidak ada.
- Minimalkan penempatan konten 3D di luar Workspace .Konten di kontainer seperti ReplicatedStorage atau ReplicatedFirst tidak memenuhi syarat untuk streaming dan dapat mempengaruhi waktu bergabung dan penggunaan memori secara negatif.
- Jika Anda memindahkan karakter pemain dengan menetapkan CFrame , lakukan dari sisi server Script dan gunakan permintaan streaming untuk lebih cepat memuat data di sekitar lokasi baru karakter.
- Secara manual atur pemainnya ReplicationFocus hanya dalam situasi unik seperti dalam pengalaman yang tidak menggunakan Player.Character .Dalam kasus ini, pastikan fokusnya dekat dengan objek(s) yang dikendalikan pemain untuk memastikan konten terus diputar di sekitar titik interaksi pemain.
Perilaku teknis
Siarkan di
Secara default, ketika pemain bergabung dengan pengalaman dengan streaming instansi diaktifkan, instans di Workspace dikirimkan ke klien, mengecualikan mengikuti:
- Keturunan dari instansi di atas
- Instansi tidak bereplikasi
Kemudian, selama gameplay, server dapat menyiarkan instans yang diperlukan ke klien, karena diperlukan.
Perilaku model
Model ditetapkan ke perilaku non-default seperti Atomic aliran di bawah aturan khusus seperti yang dijelaskan di kontrol streaming per model.Namun, model default (nonatomi) dikirim berbeda tergantung pada apakah ModelStreamingBehavior diatur ke Default ( Legacy ) atau Ditingkatkan .

Ketika ModelStreamingBehavior diatur ke Default / Legacy , wadah Model dan keturunann non-spasialnya seperti Scripts di replikasikan ke klien saat pemain bergabung.Kemudian, ketika memenuhi syarat, keturunan model BasePart turun.
Siarkan keluar
Selama gameplay, klien dapat menyiarkan keluar (hapus dari wilayah pemain Workspace ) dan BaseParts yang terkandung di dalamnya, berdasarkan perilaku yang ditetapkan oleh StreamOutBehavior .Proses dimulai dengan wilayah terjauh dari karakter pemain (atau ReplicationFocus ) dan bergerak lebih dekat sebagaimana diperlukan.Wilayah di dalam rentang StreamingMinRadius tidak pernah diputar keluar.
Ketika instansi diputar keluar, ia diasosiasikan ke nil sehingga setiap negara Luau yang ada akan terhubung kembali jika instansi diputar kembali.Sebagai hasilnya, menghapus sinyal seperti ChildRemoved atau DescendantRemoving api pada orang tuanya atau leluhur , tetapi instans itu sendiri tidak hancur dengan cara yang sama seperti panggilan Instance:Destroy().
Untuk lebih memperkirakan aliran keluar, periksa skenario ini:
Skenario | Contoh | Perilaku siaran |
---|---|---|
Suku bagian adalah dibuat secara lokal melalui Instance.new() di dalam LocalScript . | Dalam game"tangkap bendera", Anda membuat dan menempelkan bagian helm biru ke semua pemain di tim biru melalui LocalScript . | Bagian tidak direplikasi ke server, dan dikecualikan dari streaming keluar kecuali Anda menjadikannya keturunan dari bagian yang ada di server, seperti bagian dalam model karakter pemain. |
Suku cadang diklon lokal dari **** melalui ReplicatedStorage di Instance:Clone() dalam LocalScript . | Karakter penyihir melemparkan mantra dengan mengaktifkan Tool, di mana objek termasuk beberapa efek khusus di-kloning dari ReplicatedStorage dan dipindahkan ke ruang kerja di posisi penyihir. | Bagian tidak direplikasi ke server, dan dikecualikan dari streaming keluar kecuali Anda menjadikannya turunan dari bagian yang ada di server. |
Bagian adalah diperbaiki dari ReplicatedStorage ke ruang kerja melalui LocalScript . | Topi "penyihir" disimpan di ReplicatedStorage .Ketika seorang pemain memilih untuk bermain di tim penyihir, topi dipindahkan ke model karakter mereka melalui LocalScript . | Bagian tetap memenuhi syarat untuk diputar karena berasal dari server dan direplikasi ke ReplicatedStorage .Hindari pola ini karena menyebabkan desinkronisasi antara klien dan server, dan bagiannya dapat diputar; sebagai gantinya, klon bagiannya. |
Perilaku model
Jika Anda mengatur ModelStreamingBehavior ke Ditingkatkan , mesin dapat menyiarkan model Default ( Nonatomi ) ketika mereka memenuhi syarat untuk diputar, mungkin membebaskan memori di klien dan mengurangi instansi yang membutuhkan pembaruan properti.

Di bawah ditingkatkan model streaming perilaku, streaming keluar dari Default ( Nonatomik ) model berdasarkan apakah model tersebut adalah spasial (berisi keturunan) atau non-spasial (tidak berisi keturunan ).
- Model spasial hanya diputar sepenuhnya ketika descendant terakhirnya BasePart keluar, karena beberapa bagian spasial model mungkin berada dekat dengan fokus pemain/replikasi dan beberapa jauh.
- Model non-spasial hanya diputar keluar saat leluhur diputar keluar, setara dengan perilaku streaming lama keluar.
Kumpulan dan mekanisme
Ketika setidaknya satu bagian dari kumpulan adalah memenuhi syarat untuk streaming, semua bagian kumpulan juga diputar.Namun, sebuah assemblasi tidak akan menyiarkan keluar sampai semua bagiannya memenuhi syarat untuk diputar keluar.Selama streaming, semua Constraints dan Attachments turun dari BaseParts dan atomik atau permanen Models juga streaming, membantu untuk memastikan pembaruan fisika konsisten pada klien.
Perhatikan bahwa kumpulan dengan bagian diikat diperlakukan sedikit berbeda dari kumpulan hanya dengan bagian yang tidak diikat:
Komposisi pengumpulan | Perilaku siaran |
---|---|
Bagian yang tidak diikat hanya | Seluruh assemblasi dikirim sebagai unit atomik. |
Tertahan bagian akar | Hanya bagian, lampiran, dan batasan yang diperlukan untuk menautkan bagian yang diputar ke bagian akar disiarkan bersama-sama. |
Penundaan waktu
Mungkin ada sedikit kelambatan ~10 milidetik antara ketika bagian dibuat di server dan ketika di-复制 ke klien.Dalam setiap skenario berikut, Anda mungkin perlu menggunakan WaitForChild() dan teknik lain daripada menganggap bahwa peristiwa dan pembaruan properti selalu terjadi pada saat yang sama sebagai bagian streaming.
Skenario | Contoh | Perilaku siaran |
---|---|---|
A LocalScript membuat panggilan RemoteFunction ke server untuk membuat bagian | Seorang pemain mengaktifkan Tool lokal untuk menypawn bagian di server yang dapat dilihat dan berinteraksi dengan semua pemain. | Ketika fungsi remote kembali ke klien, bagian mungkin belum ada, meskipun bagian berada dekat dengan fokus klien dan dalam area yang disiarkan. |
Bagian ditambahkan ke model karakter di server melalui Script dan RemoteEvent ditembak ke klien. | Ketika seorang pemain bergabung dengan tim polisi, bagian "lencana polisi" yang disimpan di ServerStorage diklon dan ditambahkan ke model karakter pemain.A RemoteEvent ditembak dan diterima oleh klien pemain itu untuk memperbarui elemen UI lokal. | Meskipun klien menerima sinyal acara, tidak ada jaminan bahwa bagian sudah diputar ke klien itu. |
Suku bagian bertabrakan dengan wilayah tak terlihat di server dan memicu RemoteEvent pada klien. | Seorang pemain menendang bola sepak ke gawang, memicu acara "goal dicetak" | Pemain lain yang dekat dengan gol mungkin melihat acara "goal dicetak" sebelum bola telah disiarkan kepada mereka. |
Properti siaran streaming
Properti berikut mengontrol bagaimana streaming instansi berlaku untuk pengalaman Anda.Semua properti ini adalah tidak dapat diskripkan dan harus diatur pada objek Ruang kerja di Studio.

Perilaku Pemutaran Model
Mengontrol apakah Default ( Nonatomi ) model direplikasi saat pemain bergabung, atau hanya dikirim saat diperlukan.Jika properti ini diatur ke Ditingkatkan , model di Workspace hanya akan dikirim ke klien saat diperlukan, yang berpotensi mempercepat waktu bergabung.Lihat Perilaku Teknis untuk lebih banyak rincian.
Mode Integritas Streaming
Pengalaman Anda dapat berperilaku dengan cara yang tidak disengaja jika pemain pindah ke wilayah dunia yang belum disiarkan kepada mereka.Fitur integritas streaming menawarkan cara untuk menghindari situasi berpotensi bermasalah tersebut.Silakan lihat dokumentasi Enum.StreamingIntegrityMode untuk lebih banyak rincian.
StreamingMinRadius
Properti StreamingMinRadius menunjukkan radius di sekitar karakter pemain (atau ReplicationFocus ) di mana streaming terjadi dengan prioritas tertinggi.Perawatan harus diambil saat meningkatkan default, karena melakukannya akan membutuhkan lebih banyak memori dan lebih banyak bandwidth server dengan biaya komponen lain.
StreamingTargetRadius
Properti StreamingTargetRadius mengontrol jarak maksimum dari karakter pemain (atau ReplicationFocus ) di mana streaming terjadi.Perhatikan bahwa mesin diizinkan untuk menyimpan instansi yang sebelumnya dimuat di luar radius target, memungkinkan memori.
Sebuah radius target streaming yang lebih kecil StreamingTargetRadius mengurangi beban server, karena server tidak akan menyiarkan di instans tambahan di luar nilai yang ditetapkan.Namun, radius target juga merupakan jarak maksimum yang akan dapat dilihat pemain untuk melihat seluruh rincian pengalaman Anda, jadi Anda harus memilih nilai yang menciptakan keseimbangan yang bagus di antara keduanya.
Perilaku StreamKeluar
Properti StreamOutBehavior menetapkan perilaku streaming keluar sesuai dengan salah satu nilai berikut:
Pengaturan | Perilaku siaran |
---|---|
Standar | Perilaku default, saat ini sama dengan LowMemory . |
Memori Rendah | Klien hanya menyiarkan bagian dalam situasi memori rendah dan dapat menghapus konten 3D sampai hanya radius minimum hadir. |
Beruntungan | Wilayah di luar StreamingTargetRadius dapat dihapus pada klien bahkan ketika tidak ada tekanan memori.Dalam mode ini, klien tidak pernah menghapus instansi yang lebih dekat dari radius target, kecuali dalam situasi memori rendah. |
kendalisiaran per model
Secara global, properti ModelStreamingBehavior memungkinkan Anda mengontrol bagaimana model diputar saat bergabung.Selain itu, untuk menghindari masalah dengan streaming pada basis per model dan meminimalisir penggunaan WaitForChild() , Anda dapat menyesuaikan bagaimana Models dan keturunan mereka menyiarkan melalui properti ModelStreamingMode mereka.

Standar / nonatomiik
Ketika sebuah Model diatur ke Default atau Nonaktif , perilaku streaming bervariasi tergantung pada apakah ModelStreamingBehavior diatur ke Default ( Legacy ) atau Ditingkatkan .
Perilaku Pemutaran Model | Perilaku teknis |
---|---|
Dasar ( Warisan ) | Model diulang ketika pemain bergabung.Ini berpotensi menghasilkan lebih banyak instans yang dikirim selama pemuatan, lebih banyak instans yang disimpan di memori, dan kompleksitas tambahan untuk skrip yang ingin mengakses keturunan model.Sebagai contoh, terpisah LocalScript akan perlu menggunakan WaitForChild() pada keturunan BasePart di dalam model. |
Ditingkatkan | Model hanya dikirim saat diperlukan, yang berpotensi mempercepat waktu bergabung. |
Lihat perilaku teknis untuk lebih banyak detail.
Atomik
Jika Model diubah menjadi Atomik , semua keturunannya diputar bersama ketika keturunan BasePart memenuhi syarat.Sebagai hasilnya, terpisah LocalScript yang perlu mengakses instansi dalam model perlu menggunakan WaitForChild() pada model itu sendiri, tetapi tidak pada keturunan MeshPart atau Part karena mereka dikirim bersama model.
Model atom hanya diputar keluar ketika semua bagian turunannya memenuhi syarat untuk diputar, pada saat itu seluruh model diputar bersama-sama.Jika hanya beberapa bagian dari model atomik yang biasanya akan diputar keluar, seluruh model dan keturunannnya tetap ada di klien.
Skrip Lokal
local Workspace = game:GetService("Workspace")-- Model atom tidak ada saat dimuat; gunakan WaitForChild()local model = Workspace:WaitForChild("Model")-- Bagian keturunan mengalir bersama model dan segera dapat diakseslocal meshPart = model.MeshPartlocal part = model.Part
Bertahan
Model bertahan tidak terkena streaming normal masuk atau keluar.Mereka dikirim sebagai unit atom lengkap segera setelah pemain bergabung dan sebelum peristiwa Workspace.PersistentLoaded terjadi.Model permanen dan keturunannya tidak pernah diputar, tetapi untuk menangani streaming dengan aman di dalam model orangtua terpisah LocalScript, Anda harus menggunakan WaitForChild() pada model orangtua, atau menunggu acara PersistentLoaded terjadi.
Skrip Lokal
local Workspace = game:GetService("Workspace")-- Model permanen tidak ada saat dimuat; gunakan WaitForChild()local model = Workspace:WaitForChild("Model")-- Bagian keturunan mengalir bersama model dan segera dapat diakseslocal meshPart = model.MeshPartlocal part = model.Part
Pemain TetapPerPlayer
Model diatur ke PersistenPerPemain berperilaku sama dengan Persisten untuk pemain yang telah ditambahkan menggunakan Model:AddPersistentPlayer() .Untuk pemain lain, perilaku sama dengan Atomik.Anda dapat membalikkan model dari persistensi pemain melalui Model:RemovePersistentPlayer() .
Meminta streaming area
Jika Anda mengatur CFrame karakter pemain ke wilayah yang saat ini tidak dimuat, jeda streaming terjadi, jika diaktifkan.Jika Anda tahu karakter akan pindah ke area tertentu, Anda dapat menelepon Player:RequestStreamAroundAsync() untuk meminta server mengirim wilayah di sekitar lokasi itu ke klien.
Skrip berikut menunjukkan cara menembakkan peristiwa jarak jauh klien ke server untuk teleport pemain di dalam tempat ke streaming permintaan sebelum memindahkan karakter ke yang baru CFrame.
Skrip - Teleport Karakter Pemain
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Permintaan streaming di sekitar lokasi target
player:RequestStreamAroundAsync(teleportTarget)
-- Karakter teleportasi
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Fungsi teleportasi panggilan saat klien menembakkan acara remote
teleportEvent.OnServerEvent:Connect(teleportPlayer)
Skrip Lokal - Acara Remote Api
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Tembak peristiwa remoteteleportEvent:FireServer(teleportTarget)
Deteksi streaming instansi
Dalam beberapa kasus, diperlukan untuk mendeteksi kapan objek mengalir masuk atau keluar dan bereaksi terhadap peristiwa itu.Pola berguna untuk deteksi streaming adalah sebagai berikut:
Menggunakan bagian Tag dari properti kejadian, atau Editor Tag Studio, atribusikan tag logis CollectionService ke semua objek yang terpengaruh.
Dari satu LocalScript , deteksi ketika objek ditagih mengalir masuk atau keluar melalui GetInstanceAddedSignal() dan GetInstanceRemovedSignal() , lalu tangani objek sesuai dengan itu.Sebagai contoh, kode berikut menambahkan objek ber标签 Light ke dalam loop "flicker" saat mereka streaming masuk dan menghapusnya saat mereka streaming keluar.
Skrip Lokal - Pendeteksi Streaming Layanan Koleksilocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- Deteksi saat ini dan bagian yang ditagih baru mengalir masuk atau keluarfor _, light in CollectionService:GetTagged(tagName) doflickerSources[light] = trueendCollectionService:GetInstanceAddedSignal(tagName):Connect(function(light)flickerSources[light] = trueend)CollectionService:GetInstanceRemovedSignal(tagName):Connect(function(light)flickerSources[light] = nilend)-- Lingkaran flickerwhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
Sesuaikan layar jeda
Properti Player.GameplayPaused menunjukkan status jeda saat ini pemain.Properti ini dapat digunakan dengan koneksi GetPropertyChangedSignal() untuk menampilkan atau menyembunyikan GUI khusus.
Skrip Lokal
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Nonaktifkan modus jedak default
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Tampilkan GUI khusus
else
-- Sembunyikan GUI khusus
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Tingkat rincian model
Ketika streaming diaktifkan, Models di luar area yang diputar saat ini tidak akan terlihat secara default.Namun, Anda dapat menginstruksikan mesin untuk menampilkan meshes "imposter" resolusi lebih rendah untuk model yang tidak hadir di klien melalui properti LevelOfDetail setiap model.



Pengaturan model | Perilaku siaran |
---|---|
StreamingMesh | Aktifkan generasi asinkron dari mesh imposter untuk ditampilkan saat model tidak hadir di klien. |
Dinonaktifkan / Otomatis | Model menghilang ketika berada di luar radius streaming. |
Saat menggunakan meshes imposter, perhatikan hal mengikuti:
- Imposter meshes dirancang untuk dilihat pada 1024 stud dari kamera atau lebih jauh.Jika Anda telah mengurangi StreamingTargetRadius ke nilai yang jauh lebih kecil seperti 256, meshes penipu mungkin tidak terlihat diterima untuk model yang digantikannya.
- Jika model dan model turunannya semua diatur ke StreamingMesh , hanya model leluhur tingkat atas yang ditampilkan sebagai mesh penipu, melapisi semua geometri di bawah leluhur serta model turunannya.Untuk kinerja yang lebih pelaksanaan, disarankan agar Anda menggunakan Dinonaktifkan untuk model turunan.
- Tekstur tidak didukung; meshes penipu dibuat sebagai meshes halus.
- Sementara Model tidak sepenuhnya disiarkan, mesh imposter dibuat sebagai gantinya bagian-bagian individu dari model.Setelah semua bagian individual diputar, mereka menyajikan dan mesh penipu diabaikan.
- Imposter meshes tidak memiliki signifikansi fisik dan mereka bertindak sebagai tidak ada dalam hal raycasting , deteksi kolisi , dan simulasi fisika.
- Mengedit model di Studio, seperti menambahkan/menghapus/menggeser ulang bagian anak atau mengatur ulang warna, secara otomatis memperbarui representasi mesh.