Nel gioco, lo streaming delle istanze consente al motore di Roblox di caricare e scaricare dinamicamente contenuti 3D e istanze correlate nel Workspace. Questo può migliorare l'esperienza complessiva dei giocatori in diversi modi, tra cui:
- Tempi di join più veloci— I giocatori possono iniziare a giocare in una parte del mondo mentre il resto del mondo viene caricato in background.
- Efficienza della memoria— I giochi possono essere giocati su dispositivi con meno memoria poiché i contenuti vengono caricati e scaricati dinamicamente. Mondi più immersivi e dettagliati possono essere giocati su un range più ampio di dispositivi.
- Prestazioni migliorate— Migliori frame rate e prestazioni, poiché il server può spendere meno tempo e larghezza di banda a sincronizzare i cambiamenti tra il mondo e i giocatori in esso. I client trascorrono meno tempo ad aggiornare istanze che non sono attualmente rilevanti per il giocatore.
- Livello di dettaglio— Quando configurati, modelli distanti, avatar di piattaforma e terreni rimangono visibili anche quando non vengono trasmessi ai client, mantenendo il gioco ottimizzato senza sacrificare completamente i dettagli visivi di fondo.
Lo streaming delle istanze è controllato dalla proprietà Workspace.StreamingEnabled, abilitata per impostazione predefinita per nuovi luoghi creati in Studio. Questa proprietà non può essere impostata in uno script.

Comportamento tecnico
Ambito
La logica e le funzionalità di streaming si applicano esclusivamente alle istanze che sono discendenti di Workspace, mentre le istanze memorizzate in altri contenitori come ReplicatedStorage e ReplicatedFirst non sono idonee per lo streaming. Ad esempio, posizionare un modello atomico sotto ReplicatedStorage non garantisce replicazione atomica.
Streaming in
Quando un giocatore entra in un gioco con lo streaming delle istanze abilitato:
Le istanze nel Workspace vengono replicate al client escludendo le seguenti:

Models impostati su Atomico, Persistente o PersistentePerGiocatore; consulta i controlli di streaming per modello

Models impostati su Nonatomico (predefinito) quando Workspace.ModelStreamingBehavior è impostato su Improved

Discendenti delle istanze sopra
Durante il gioco, il server potrebbe trasmettere istanze nelle categorie differite sopra al client in base alle proprietà di streaming del gioco, alla posizione del giocatore, alle prestazioni del dispositivo del client e ad altre condizioni.
Streaming out
Durante il gioco, un client può rimuovere regioni di BaseParts dal Workspace del giocatore in base al comportamento impostato da Workspace.StreamOutBehavior. Il processo inizia con le regioni più lontane dai foci di replicazione e si avvicina, se necessario. Le regioni all'interno dell'intervallo Workspace.StreamingMinRadius non vengono mai scaricate.
Nota che un Model senza discendenti BasePart, come uno utilizzato semplicemente come "contenitore" per istanze non BasePart come script, è esente dallo streaming out a meno che non venga reso un discendente di un BasePart.
Assemblee
Le assemblee fisiche vengono trasmesse in come unità complete, comprese le loro associate Constraints e Attachments, aiutando a garantire aggiornamenti fisici coerenti sui client. L'unica eccezione è quando l'assemblea è ancorata, nel qual caso solo le BaseParts all'interno del raggio di streaming vengono trasmesse insieme alle loro associate Constraints e Attachments.
Le assemblee non vengono trasmesse out fino a quando tutte le loro BaseParts non sono idonee per lo streaming out.
Proprietà di streaming
Le seguenti proprietà controllano come lo streaming delle istanze si applica al tuo gioco. Tutte queste proprietà sono non scriptabili e devono essere impostate sull'oggetto Workspace in Studio.

| Proprietà | Descrizione |
|---|---|
| EnableSLIMAvatars | Controlla se un modello SLIM viene generato per i personaggi avatar nel gioco. Quando abilitato, gli avatar vengono resi utilizzando SLIM nello stesso modo in cui impostare Model.LevelOfDetail su SLIM funziona per altri modelli. |
| ModelStreamingBehavior | Controlla come i modelli Nonatomici (predefinito) vengono trasmessi in e out. RACCOMANDATO Usa Improved per abilitare lo streaming più efficiente per i Models con discendenti BasePart. |
| StreamingIntegrityMode | Il gioco potrebbe comportarsi in modi imprevedibili se un giocatore si sposta in una regione del mondo che non è stata trasmessa. Questa proprietà offre un modo per evitare quelle situazioni potenzialmente problematiche. RACCOMANDATO Usa PauseOutsideLoadedArea per bilanciare l'integrità del gameplay senza mettere in pausa in modo non necessario o troppo spesso. Puoi anche personalizzare la schermata di pausa. |
| StreamingMinRadius | Questa proprietà indica il raggio attorno ai foci di replicazione in cui le istanze vengono trasmesse con la massima priorità. È necessario prestare attenzione quando si aumenta il valore predefinito, poiché farlo richiederà più memoria e più larghezza di banda del server a scapito di altri componenti. RACCOMANDATO Usa il valore predefinito di 64 per massimizzare quanto il motore può scalare il gioco per dispositivi a bassa potenza. |
| StreamingTargetRadius | Questa proprietà controlla la distanza massima dal foci di replicazione in cui le istanze vengono trasmesse. Nota che il motore può trattenere istanze precedentemente caricate oltre il raggio target, se la memoria lo consente. Un valore più piccolo di StreamingTargetRadius riduce il carico di lavoro del server, poiché il server non trasmette ulteriori istanze oltre il valore impostato. Tuttavia, il raggio target è anche la distanza massima che i giocatori potranno vedere il pieno dettaglio del tuo gioco, quindi dovresti scegliere un valore che crei un buon equilibrio tra questi. RACCOMANDATO Usa il valore predefinito di 1024 per trovare un buon equilibrio tra visibilità per i giocatori su dispositivi ad alte prestazioni e un ragionevole utilizzo della memoria. |
| StreamOutBehavior | Questa proprietà imposta il comportamento dello streaming out in base al valore di Enum.StreamOutBehavior. Se impostato su LowMemory (predefinito), il client trasmette solo le regioni oltre il raggio minimo in una situazione di bassa memoria. Se impostato su Opportunistic, le regioni oltre StreamingTargetRadius possono essere rimosse dal client anche quando non c'è pressione sulla memoria (in questo modo, il client non rimuove mai le istanze che si trovano all'interno del raggio target, tranne in situazioni di bassa memoria). RACCOMANDATO Usa Opportunistic per consentire al client di raccogliere aggressivamente contenuti di raccolta, riducendo significativamente l'uso della memoria e aiutando a prevenire crash per mancanza di memoria. |
Foco di replicazione
Per impostazione predefinita, lo streaming si verifica attorno al PrimaryPart del personaggio locale del giocatore, sebbene tu possa specificare un diverso punto di attenzione per la replicazione tramite Player.ReplicationFocus.
Puoi anche aggiungere e rimuovere ulteriori foci di replicazione tramite Player:AddReplicationFocus() e Player:RemoveReplicationFocus() per abilitare dinamicamente lo streaming in più aree del gioco.
La simulazione fisica lato client, inclusa la previsione e le risimulazioni quando è implementata l'autorità del server, si verifica solo nelle aree trasmesse, anche per istanze create localmente e per istanze Persistent. Se hai istanze che desideri continuare a simulare anche quando sono lontane dal personaggio, crea un ulteriore punto di attenzione per la replicazione vicino a quelle istanze.
Controlli di streaming per modello
Per evitare problemi con lo streaming su base per modello e minimizzare l'uso di WaitForChild(), puoi personalizzare come Models e i loro discendenti vengono trasmessi attraverso la loro proprietà ModelStreamingMode.
Nonatomico
Per impostazione predefinita, i modelli sono Nonatomic e vengono trasmessi in/out in base all'impostazione di Workspace.ModelStreamingBehavior su Legacy (predefinito) o Improved.
Legacy
Quando Workspace.ModelStreamingBehavior è impostato su Legacy (predefinito), il contenitore Model e i suoi discendenti non BasePart come Scripts vengono replicati al client quando il giocatore entra. Quindi, quando sono idonei, i discendenti BasePart del modello vengono trasmessi.

Migliorato
Quando Workspace.ModelStreamingBehavior è impostato su Improved, il comportamento dello streaming del modello varia in base al fatto che il modello contenga discendenti BasePart o non contenga discendenti BasePart:
Un modello con discendenti BasePart viene trasmesso in solo quando uno dei suoi discendenti BasePart è idoneo per lo streaming in. A quel punto, il modello e il BasePart idoneo vengono trasmessi in, insieme ai discendenti non BasePart del modello.
Quando l'ultimo BasePart restante del modello viene trasmesso out, anche il modello stesso verrà trasmesso.

Atomico
Se un Model è impostato su Atomic, tutti i suoi discendenti iniziali vengono trasmessi insieme quando un discendente BasePart è idoneo per essere trasmesso. Di conseguenza, uno script lato client che deve accedere alle istanze all'interno del 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 out solo quando tutte le sue parti discendenti sono idonee per lo streaming out, momento in cui l'intero modello viene trasmesso insieme.

Persistente
I modelli Persistent non sono soggetti a normali streaming in o out. Vengono inviati come un'unità atomica completa subito dopo che il giocatore entra e prima che venga attivato l'evento Workspace.PersistentLoaded. I modelli persistenti e i loro discendenti non vengono mai trasmessi out, ma per gestire in modo sicuro lo streaming in all'interno di uno script lato client, dovresti attendere l'attivazione dell'evento PersistentLoaded.

PersistentePerGiocatore
I modelli impostati su PersistentPerPlayer si comportano allo stesso modo di Persistent per i giocatori che sono stati aggiunti utilizzando Model:AddPersistentPlayer(). Per gli altri giocatori, il comportamento è lo stesso di Atomic. Puoi ripristinare un modello dalla persistenza del giocatore tramite Model:RemovePersistentPlayer().
Personalizzazione della schermata di pausa
Presupponendo che Workspace.StreamingIntegrityMode sia impostato sul raccomandato PauseOutsideLoadedArea, il gioco si metterà in pausa se un giocatore si sposta in una regione del mondo che non è stata trasmessa. In questi casi, la proprietà Player.GameplayPaused indica lo stato di pausa attuale del giocatore, il quale può essere utilizzato con una connessione a GetPropertyChangedSignal() per mostrare o nascondere un GUI personalizzato.
LocalScript
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Disabilita il modalità pausa predefinita
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Mostra GUI personalizzato
else
-- Nascondi GUI personalizzato
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Debugging runtime
Il motore include più pannelli di debug a schermo che possono essere abilitati sul client utilizzando scorciatoie da tastiera. Per accedere alle informazioni di debug dello streaming:
Apri il sovrapposizione di debug Network Summary tramite ShiftCtrlF3 (Windows) o Shift⌘F3 (Mac).
Una volta aperto il sovrapposizione di debug, premi Shift1 ripetutamente per cicli attraverso i pannelli disponibili. Il quarto pannello è la vista di debug Streaming che visualizza informazioni utili a runtime:
- Impostazioni di streaming attive
- Region attualmente caricate (trasmesse in)
- Comportamento e stato dello streaming
Una volta abilitato, le regioni evidenziate colorate appaiono nella vista 3D:
| Colore | Descrizione |
|---|---|
| Inferiore a StreamingMinRadius | |
| Maggiore o uguale a StreamingMinRadius e inferiore a StreamingTargetRadius | |
| Uguale a StreamingTargetRadius | |
| Maggiore di StreamingTargetRadius |
