Streaming instansi

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

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.

The Properties window with the StreamingEnabled property enabled.

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:

Kemudian, selama gameplay, server dapat menyiarkan instans yang diperlukan ke klien, karena diperlukan.

Diagram showing when various instances and their descendants in the Workspace stream in.
1 Tanah diperlakukan secara unik, di mana instansi direplikasi ke klien saat pengalaman dimuat, tetapi wilayah tanah hanya diputar saat 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 .

The Properties window with the ModelStreamingBehavior property set to Default.

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.

Diagram showing default model stream in behavior.

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:

SkenarioContohPerilaku 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.

The Properties window with the ModelStreamingBehavior property set to Improved.

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 pengumpulanPerilaku siaran
Bagian yang tidak diikat hanyaSeluruh assemblasi dikirim sebagai unit atomik.
Tertahan bagian akarHanya 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.

SkenarioContohPerilaku siaran
A LocalScript membuat panggilan RemoteFunction ke server untuk membuat bagianSeorang 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.

The Properties window with the ModelStreamingBehavior, StreamingIntegrityMode, StreamingMidRadius, StreamingTargetRadius, and StreamOutBehavior property highlighted.

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:

PengaturanPerilaku 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.

The Properties window with the ModelStreamingMode property set to Default. The property is also highlighted.

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 ModelPerilaku 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.

A diagram showing Atomic model streaming along with children.
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 diakses
local meshPart = model.MeshPart
local 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.

A diagram showing Persistent model streaming along with children.
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 diakses
local meshPart = model.MeshPart
local 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 remote
teleportEvent: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:

  1. Menggunakan bagian Tag dari properti kejadian, atau Editor Tag Studio, atribusikan tag logis CollectionService ke semua objek yang terpengaruh.

  2. 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 Koleksi

    local CollectionService = game:GetService("CollectionService")
    local tagName = "FlickerLightSource"
    local random = Random.new()
    local flickerSources = {}
    -- Deteksi saat ini dan bagian yang ditagih baru mengalir masuk atau keluar
    for _, light in CollectionService:GetTagged(tagName) do
    flickerSources[light] = true
    end
    CollectionService:GetInstanceAddedSignal(tagName):Connect(function(light)
    flickerSources[light] = true
    end)
    CollectionService:GetInstanceRemovedSignal(tagName):Connect(function(light)
    flickerSources[light] = nil
    end)
    -- Lingkaran flicker
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.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.

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.

Model aktual
>

The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.

Jaring "impostor" resolusi rendah
>

Pengaturan modelPerilaku 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.