Lo streaming dell'istanza in-experience consente all'Engine Roblox di caricare e scaricare dinamicamente contenuti 3D e istanze correlate nelle regioni del Mondo.Questo può migliorare l'esperienza complessiva del giocatore in diversi modi, ad esempio:
- Tempi di adesione più rapidi — I giocatori possono iniziare a giocare in una parte del mondo mentre più del mondo carica in background.
- Eff率 della memoria — Le esperienze possono essere riprodotte su dispositivi con meno memoria poiché il contenuto viene dinamicamente trasmesso in entrata e in uscita.Mondi più immersivi e dettagliati possono essere giocati su una gamma più ampia di dispositivi.
- Prestazioni migliorate — Migliore tasso di frame e Prestazione, poiché il server può spendere meno tempo e banda di sincronizzazione delle modifiche tra il mondo e i giocatori in esso.I client spendono meno tempo nell'aggiornamento delle istanze che non sono attualmente rilevanti per il Giocatore.
- Livello di dettaglio — Modelli distanti e terreno rimangono visibili anche quando non vengono trasmessi ai client, mantenendo l'esperienza ottimizzata senza sacrificare completamente le immagini di sfondo.
Abilita lo streaming
Lo streaming delle istanze è abilitato attraverso la proprietà StreamingEnabled dell'oggetto Workspace in Studio.Questa proprietà non può essere impostata in uno script.Lo streaming è abilitato per impostazione predefinita per i nuovi luoghi creati in Studio.

Una volta abilitato, si consiglia di aderire alle seguenti pratiche:
- Poiché i client non avranno tipicamente a disposizione l'intero Workspace , utilizza lo strumento/API appropriato per garantire che le istanze esistano prima di tentare di accedervi in un LocalScript .Ad esempio, utilizza per i controlli di streaming per modello , rileva lo streaming di istanze , o usa WaitForChild() su oggetti che potrebbero non esistere.
- Minimizza il posizionamento del contenuto 3D al di fuori di Workspace .Il contenuto nei container come ReplicatedStorage o ReplicatedFirst non è idoneo per lo streaming e può influenzare negativamente il tempo di join e l'utilizzo della memoria.
- Se sposti il personaggio di un Giocatoreimpostando il suo CFrame, fallo da un lato del server Script e usa richieste di streaming per caricare più rapidamente i dati intorno alla nuova posizione del personaggio.
- Imposta manualmente il Giocatoredi ReplicationFocus solo in situazioni uniche come nelle esperienze che non utilizzano un Player.Character .In questi casi, assicurati che il focus sia vicino all'oggetto(i) che il giocatore controlla per garantire che il contenuto continui a flusso intorno al punto di interazione del Giocatore.
Comportamento tecnico
Flusso in
Per impostazione predefinita, quando un giocatore si unisce a un'esperienza con streaming di istanze abilitato, le istanze nel Workspace sono replicate al client, escludendo quanto Seguendo:
- Discendenti delle istanze sopra indicate
- Istenze non replicanti
Quindi, durante il Partita, il server può inviare le istanze necessarie al client, come sono necessarie.
Comportamento del modello
Modelli impostati a comportamento non predefinito come streaming atomico sotto regole speciali come descritto in controlli di streaming per modello.Tuttavia, i modelli predefiniti (non atomici) vengono inviati in modo diverso in base a se ModelStreamingBehavior è impostato su Predefinito ( Legacy ) o Migliorato .

Quando ModelStreamingBehavior è impostato su Default / Legacy , il contenitore Model e i suoi discendenti non spaziali come Scripts si replicano al client quando il giocatore si unisce.Quindi, quando idoneo, i discendenti del modello BasePart scendono.
Flusso fuori
Durante il Partita, un client può trasmettere (rimuovere dalle regioni del GiocatoreWorkspace ) e le BaseParts contenute al loro interno, in base al comportamento impostato da StreamOutBehavior .Il processo inizia con le regioni più lontane dal personaggio del Giocatore(o ReplicationFocus ) e si muove più vicino quando necessario.Le regioni all'interno della gamma StreamingMinRadius non vengono mai trasmesse.
Quando un'istanza viene riversata, viene genitorata a nil in modo che qualsiasi stato Luau esistente si riconnetta se l'istanza viene riversata indietro.Come Risultato, vengono rimossi i segnali di rimozione come ChildRemoved o DescendantRemoving fuoco sul suo genitore o antenato , ma l'istanza stessa non viene distrutta nello stesso senso di una chiamata Instance:Destroy().
Per anticipare ulteriormente lo stream out, esamina questi scenari:
Scenario | Esempio | Comportamento di streaming |
---|---|---|
Una parte è creata localmente attraverso Instance.new() in un LocalScript . | In un Gioco"cattura la indicatore, (verb) flaggare, marcare", crei e attacchi le parti del casco blu a tutti i giocatori della squadra blu attraverso un LocalScript . | La parte non viene replicata sul Servere è esente dalla trasmissione a meno che non la renda un discendente di una parte che esiste sul Server, come una parte all'interno del modello di personaggio di un Giocatore. |
Una parte è clonata localmente da ReplicatedStorage attraverso Instance:Clone() in un LocalScript . | Un personaggio mago lancia un incantesimo attivando un Tool , su cui viene clonato da un oggetto che include diversi ReplicatedStorage e viene parentizzato allo spazio di lavoro alla posizione del mago. | La parte non viene replicata sul Servere è esente dalla trasmissione a meno che non la renda un discendente di una parte che esiste sul Server. |
Una parte è riparata da ReplicatedStorage a l'area di lavoro attraverso un LocalScript . | Un "cappello del mago" viene memorizzato in ReplicatedStorage .Quando un giocatore sceglie di giocare nella teamdel mago, il cappello viene spostato nel suo modello di personaggio attraverso un LocalScript . | La parte rimane idonea per lo streaming poiché proviene dal server e viene replicata a ReplicatedStorage .Evita questo modello poiché causa una desincronizzazione tra il client e il Servere la parte può essere trasmessa; invece, clona la parte. |
Comportamento del modello
Se impostate ModelStreamingBehavior a Migliorato , l'engine può trasmettere Modelli predefiniti ( Non atomici ) quando sono idonei a essere trasmessi, potenzialmente liberando memoria sul client e riducendo le istanze che hanno bisogno di aggiornamenti di proprietà.

Sotto Migliorato il comportamento di streaming del modello, lo streaming fuori dal modello predefinito ( Non atomico ) è basato sul fatto che il modello sia spaziale (contiene discendenti) o non spaziale (non contiene discendenti ).
- Un modello spaziale viene trasmesso completamente solo quando il suo ultimo discendente rimanente BasePart esce, poiché alcune delle parti spaziali del modello possono essere vicine al focus del giocatore/replicazione e alcune molto lontane.
- Un modello non spaziale viene trasmesso solo quando un antenato viene trasmesso, equivalente al comportamento di streaming legacy.
Assemblaggi e meccanismi
Quando almeno una parte di un assemblaggio è idonea per lo streaming, tutte le parti dell'assemblaggio vengono anche in streaming.Tuttavia, un'assemblaggio non trasmetterà fuori fino a quando tutte le sue parti non sono idonee per la trasmissione.Durante lo streaming, tutto il Constraints e Attachments discendente da BaseParts e atomico o persistente Models Flussoanche, aiutando a garantire aggiornamenti fisici coerenti sui client.
Si noti che le assemblaggi con parti ancorate ancorate sono trattate in modo leggermente diverso dalle assemblaggi con solo parti non ancorate:
Composizione dell'assemblaggio | Comportamento di streaming |
---|---|
Solo parti non ancorate | L'intera assemblata viene inviata come unità atomica. |
Ancorato parte radice ancorata | Solo le parti, gli allegati e le restrizioni necessarie per collegare le parti streaming alla parte radice vengono trasmesse insieme. |
Ritardo di tempo
Potrebbe esserci un leggero ritardo di ~10 millisecondi tra quando una parte viene creata sul server e quando viene replicata ai client.In ciascuno dei seguenti scenari potresti dover usare WaitForChild() e altre tecniche piuttosto che supporre che gli eventi e gli aggiornamenti delle proprietà avvengano sempre allo stesso tempo come parte dello streaming.
Scenario | Esempio | Comportamento di streaming |
---|---|---|
Un LocalScript fa una chiamata RemoteFunction al server per creare una parte. | Un giocatore attiva un Tool localmente per generare una parte sul server che tutti i giocatori possono vedere e interagire. | Quando la funzione remota ritorna al client, la parte potrebbe non esistere ancora, anche se la parte è vicina al focus del client e all'interno di un'area streaming. |
Una parte viene aggiunta a un modello di personaggio sul server tramite un Script e un RemoteEvent viene sparato a un client. | Quando un giocatore si unisce alla teamdi polizia, una parte del "badge della polizia" memorizzata in ServerStorage viene clonata e allegata al modello di personaggio del Giocatore.Un RemoteEvent viene inviato e ricevuto dal client di quel Giocatoreal fine di aggiornare un elemento UI locale. | Anche se il client riceve il segnale dell'evento, non c'è alcuna garanzia che la parte sia già stata trasmessa a quel client. |
Una parte si scontra con una regione invisibile sul server e attiva un RemoteEvent sul client. | Un giocatore calcia una palla da calcio in una porta, attivando un evento "goal segnato". | Altri giocatori che sono vicini all'obiettivo possono vedere l'evento "goal segnato" prima che la palla sia stata trasmessa a loro. |
Proprietà di streaming
Le seguenti proprietà controllano il modo in cui lo streaming delle istanze si applica alla tua esperienza.Tutte queste proprietà sono non scriptabili e devono essere impostate sull'oggetto Workspace in Studio.

Modello streaming comportamento
Controlla se i modelli Predefiniti ( Non atomici ) vengono replicati quando un giocatore si unisce, o vengono inviati solo quando necessario.Se questa proprietà è impostata su Migliorata , i modelli in Workspace verranno inviati ai client solo quando necessario, potenzialmente velocizzando i tempi di join.Vedi Comportamento tecnico per maggiori dettagli.
Modalità Streaming di Integrità
La tua esperienza può comportarsi in modi non intenzionali se un giocatore si muove in una regione del mondo che non è stata trasmessa a loro.La funzione integrità dello streaming offre un modo per evitare quelle situazioni potenzialmente problematiche.Si prega di consultare la documentazione Enum.StreamingIntegrityMode per maggiori dettagli.
MinRadio di Streaming
La proprietà StreamingMinRadius indica il raggio intorno al personaggio del Giocatore(o ReplicationFocus ) in cui le istanze vengono in streaming con la priorità più alta.Si deve prestare attenzione quando si aumenta il valore predefinito, poiché farlo richiederà più memoria e più larghezza di banda del server a spese di altre componenti.
StreamingTargetRadius
La proprietà StreamingTargetRadius controlla la distanza massima da cui lo stream si trova lontano dal personaggio del Giocatore(o ReplicationFocus ) in cui gli stream si trovano.Si noti che il motore è autorizzato a mantenere le istanze precedentemente caricate oltre il raggio di destinazione, memoria permettendo.
Un più piccolo StreamingTargetRadius riduce il carico del server, poiché il server non trasmetterà in istanze aggiuntive oltre il valore impostato.Tuttavia, il raggio target è anche la distanza massima che i giocatori saranno in grado di vedere i dettagli completi della tua esperienza, quindi dovresti scegliere un valore che crei un bel equilibrio tra questi.
Comportamento di StreamOut
La proprietà StreamOutBehavior imposta il comportamento di streaming out in base a uno dei seguenti valori:
Impostazione | Comportamento di streaming |
---|---|
Basilare | Comportamento predefinito, attualmente lo stesso di LowMemory . |
Memoria bassa | Il client streamingizza solo parti in una situazione di bassa memoria e può rimuovere il contenuto 3D fino a quando non è presente solo il raggio minimo. |
Opportunistico | Le regioni oltre StreamingTargetRadius possono essere rimosse sul client anche quando non c'è pressione di memoria.In questa modalità, il cliente non rimuove mai le istanze che sono più vicine al raggio target, tranne che in situazioni di bassa memoria. |
Controlli di streaming per modello per modello
A livello globale, la proprietà ModelStreamingBehavior ti consente di controllare come vengono trasmessi i modelli al join.Inoltre, per evitare problemi con lo streaming su base per modello e minimizzare l'uso di WaitForChild() , puoi personalizzare come Models e i loro discendenti streaming attraverso la loro ProprietàModelStreamingMode.

Predefinito / non atomico
Quando un Model è impostato su Default o Nonatico , il comportamento di streaming varia a seconda se ModelStreamingBehavior è impostato su Default ( Legacy ) o Migliorato .
Modello streaming comportamento | Comportamento tecnico |
---|---|
Predefinito ( Eredità ) | Il modello viene replicato quando un giocatore si unisce.Questo potrebbe comportare più istanze inviate durante il caricamento, più istanze memorizzate in memoria e una maggiore complessità per gli script che vogliono accedere ai discendenti del modello.Ad esempio, un separato LocalScript dovrà usare WaitForChild() su un discendente BasePart all'interno del modello. |
Migliorato | Il modello viene inviato solo quando necessario, potenziando potenzialmente i tempi di join. |
Vedi comportamento tecnico per maggiori dettagli.
Atomico
Se un Model viene cambiato in Atomico , tutti i suoi discendenti vengono trasmessi insieme quando un discendente BasePart è idoneo.Di Risultato, un separato LocalScript che deve accedere alle istanze nel modello dovrebbe utilizzare WaitForChild() sul modello stesso, ma non su un discendente MeshPart o Part poiché vengono inviati insieme al modello.
Un modello atomico viene trasmesso solo quando tutte le sue parti discendenti sono idonee alla trasmissione, a quel punto l'intero modello viene trasmesso insieme.Se solo alcune parti di un modello atomico verrebbero tipicamente trasmesse in streaming, l'intero modello e i suoi discendenti rimangono sul client.
Script locale
local Workspace = game:GetService("Workspace")-- Il modello atomico non esiste al momento del caricamento; usa WaitForChild()local model = Workspace:WaitForChild("Model")-- Le parti discendenti vengono in streaming con il modello e sono immediatamente accessibililocal meshPart = model.MeshPartlocal part = model.Part
Persistente
I modelli persistenti non sono soggetti a streaming normale in o fuori. Vengono inviati come unità atomica completa poco dopo che il giocatore si unisce e prima che si attivi l'evento Workspace.PersistentLoaded.I modelli persistenti e i loro discendenti non vengono mai trasmessi, ma per gestire in sicurezza lo streaming all'interno di un modello separato LocalScript , dovresti usare WaitForChild() sul modello padre, o aspettare che l'evento PersistentLoaded venga Lanciare.
Script locale
local Workspace = game:GetService("Workspace")-- Il modello persistente non esiste al momento del caricamento; usa WaitForChild()local model = Workspace:WaitForChild("Model")-- Le parti discendenti vengono in streaming con il modello e sono immediatamente accessibililocal meshPart = model.MeshPartlocal part = model.Part
Persistente per giocatore
I modelli impostati su PersistentPerPlayer si comportano allo stesso modo di Persistente per i giocatori che sono stati aggiunti utilizzando Model:AddPersistentPlayer() .Per gli altri giocatori, il comportamento è lo stesso di Atomico.Puoi ripristinare un modello dalla persistenza del giocatore attraverso Model:RemovePersistentPlayer() .
Richiedi area streaming
Se impostate il di un personaggio di giocatore in una regione che non è attualmente caricata, si verifica una pausa di streaming, se abilitata.Se sai che il personaggio si sposterà in un'area specifica, puoi chiamare Player:RequestStreamAroundAsync() per richiedere che il server invii regioni intorno a quella posizione al client.
Gli script seguenti mostrano come lanciare un evento remoto client-to-server per teletrasportare un giocatore all'interno di un Posto, producendo alla richiesta di streaming prima di spostare il personaggio in una nuova .
Script - Teletrasporta il personaggio del giocatore
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Richiesta di streaming intorno alla posizione target
player:RequestStreamAroundAsync(teleportTarget)
-- Personaggio di teletrasporto
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Chiama la funzione di teletrasporto quando il client lancia l'evento remoto
teleportEvent.OnServerEvent:Connect(teleportPlayer)
Script locale - Evento remoto di fuoco
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Spara l'evento remototeleportEvent:FireServer(teleportTarget)
Rilevamento dello streaming dell'istanza
In alcuni casi, è necessario rilevare quando un oggetto fluisce in o fuori e reagire a quell'evento.Un modello utile per la rilevazione dello streaming è il seguente:
Usando la sezione Tag delle proprietà di un'esempioo l'editor di tag di Studio , assegna un tag logico a tutti gli oggetti interessati.
Da un singolo LocalScript , rileva quando un oggetto contrassegnato flusso in o attraverso GetInstanceAddedSignal() e GetInstanceRemovedSignal() , quindi gestisci l'oggetto di conseguenza.Ad esempio, il seguente codice aggiunge oggetti contrassegnati con Light in un ciclo "flicker" quando vengono in streaming e li rimuove quando vengono in streaming.
Script locale - Rilevamento dello streaming del servizio di raccoltalocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- Rileva attualmente e nuove parti contrassegnate in streaming in o fuorifor _, 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)-- Ciclo lampeggiantewhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
Personalizza lo schermo di pausa
La proprietà Player.GameplayPaused indica lo stato di pausa attuale del Giocatore.Questa proprietà può essere utilizzata con una connessione GetPropertyChangedSignal() per mostrare o nascondere un GUI or Intefaccia grafica utentepersonalizzato.
Script locale
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Disabilita la modalità di pausa predefinita
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Mostra GUI or Intefaccia grafica utentepersonalizzata
else
-- Nascondi GUI or Intefaccia grafica utentepersonalizzata
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Livello di dettaglio del modello
Quando lo streaming è abilitato, Models al di fuori dell'area attualmente trasmessa non sarà visibile per impostazione predefinita.Tuttavia, puoi istruire il motore a rendere mesh "imposter" di risoluzione inferiore per i modelli che non sono presenti sui client attraverso la ProprietàLevelOfDetail di ogni modello.



Impostazione del modello | Comportamento di streaming |
---|---|
StreamingMesh | Attiva la generazione asincrona di una mesh impostore da mostrare quando il modello non è presente sui client. |
Disabilitato / Automatico | Il modello scompare quando è al di fuori del raggio di streaming. |
Quando si utilizzano mesh di impostore, nota quanto Seguendo:
- Le maglie degli impostori sono progettate per essere viste a 1024 studs di distanza dalla fotocamera o ulteriormente.Se hai ridotto StreamingTargetRadius a un valore molto più piccolo come 256, le maglie degli impostori potrebbero non essere visivamente accettabili per il modello che sostituiscono.
- Se un modello e i suoi modelli descendenti sono tutti impostati su StreamingMesh , solo il modello antenato di alto livello viene reso come Mesh, magliaimpostore, avvolgendo tutte le geometrie sotto l'antenato così come i suoi modelli descendenti.Per una migliore Prestazione, si consiglia di utilizzare Disabilitato per i modelli discendenti.
- Le texture non sono supportate; le maglie degli impostori vengono visualizzate come maglie lisce.
- Mentre un Model non viene completamente trasmesso, la mesh dell'impostore viene resa invece di singole parti del modello.Una volta che tutte le parti individuali sono state trasmesse, vengono visualizzate e la mesh dell'impostore viene ignorata.
- Le maglie degli impostori non hanno alcuna rilevanza fisica e agiscono come inesistenti rispetto a raycasting, rilevamento della collisione e simulazione fisica.
- L'elaborazione di un modello in Studio, come l'aggiunta/rimozione/riposizionamento delle parti figlie o il ripristino dei colori, aggiorna automaticamente la Mesh, magliarappresentativa.