In-experience streaming dell'istanza consente al motore Roblox di caricare e scaricare dinamicamente contenuti 3D e istanze correlate in regioni del Mondo. Ciò può migliorare l'esperienza complessiva del giocatore in diversi modi, ad esempio:
- Tempi di join più veloci — I giocatori possono iniziare a giocare in una parte del mondo mentre più del mondo si carica in background.
- Efficienza della memoria — Le esperienze possono essere giocate su dispositivi con meno memoria poiché il contenuto viene riprodotto in modo dinamico in e out. Mondi più coinvolgenti e dettagliati possono essere giocati su una gamma più ampia di dispositivi.
- Prestazioni migliorate — Migliori tassi 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 aggiornando le istanze che non sono attualmente rilevanti per il Giocatore.
- Livello di dettaglio — I modelli e il terreno distanti rimangono visibili anche quando non vengono streamed ai client, mantenendo l'esperienza ottimizzata senza sacrificare completamente i visual di sfondo.
Abilitare lo streaming
Il streaming delle istanze è abilitato attraverso la proprietà StreamingEnabled dell'oggetto Workspace in Studio. Questa proprietà non può essere impostata in uno script. Il 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 generalmente l'intero Workspace disponibile localmente, utilizza lo strumento / l'API appropriato per assicurarti che le istanze esistano prima di tentare di accedervi in un LocalScript . Ad esempio, utilizza controlli di streaming per modelli, 2>rileva istanze di streaming</
- Minimizza il posizionamento del contenuto 3D al di fuori di Workspace . Il contenuto in container come ReplicatedStorage o ReplicatedFirst non è idoneo per lo streaming e potrebbe influire negativamente sul tempo di join e sull'utilizzo della memoria.
- Se sposti il personaggio di un Giocatoreimpostando il suo CFrame, fallo da un lato Script e usa richieste di streaming per caricare più rapidamente i dati intorno alla nuova posizione del personaggio.
- Impostato manualmente il ReplicationFocus del Giocatoresolo in situazioni uniche come in esperienze che non utilizzano un Player.Character . In questi casi, assicurati che il focus sia vicino all'oggetto(s) che il giocatore controlla per assicurare che il contenuto venga riprodotto intorno al punto di interazione del Giocatore.
Comportamento tecnico
Streaming in
Per impostazione predefinita, quando un giocatore si unisce a un'esperienza con l'istanza di streaming abilitata, le istanze nel Workspace vengono replicate al client, esclusa la Seguendo:
- Discendenti delle istanze sopra elencate
- Non riplicare istanze
Quindi, durante il Partita, il server potrebbe stream necessarie istanze al client, come quando sono necessarie.
Comportamento del modello
I modelli impostati su comportamenti non predefiniti come Atomici stream in under special rules as outlined in Per-Model Streaming Controls . However, default (nonatic) modelli sono inviati in modo diverso in base to whether ModelStreamingBehaviour is set to 1> Default1> ( 4> Legacy4> ) or 7> Improved7> .
Quando ModelStreamingBehavior è impostato su Default / Legacy , il container 1> Class.Model1> e i suoi discendenti non spaziali come 4> Class.Script|Scripts4> si replicano sul client quando il giocatore si unisce. Quindi, quando è elegibile, il modello's 7>
Abbastanza
Durante il Partita, un client potrebbe stream out (rimuovere dalle regioni del GiocatoreWorkspace ) e le regioni contenute all'interno, in base al comportamento impostato da BaseParts. Il processo inizia con le regioni più lontane dal personaggio del Giocatore(o
Quando un istanza viene rilevata, è parented a nil in modo che qualsiasi stato Luau esistente si ricongiunga se l'istanza viene rilevata indietro. Di Risultato, i segnali di rimozione come Class.Instance.ChildRem
Per anticipare ulteriormente lo stream out, esamina queste scenari:
Scenario | Esempio | Comportamento di streaming |
---|---|---|
Una parte è stata creata localmente attraverso Class.Instance.new() in un Instance.new() . | In un Gioco"cattura la indicatore, (verb) flaggare, marcare", crei e attacchi i pezzi del casco blu a tutti i giocatori sulla squadra blu attraverso un LocalScript . | La parte non viene replicata al Servere non è soggetta alla riproduzione a meno che non tu la renda discendente di una parte che esiste sul Server, come una parte all'interno del modello di personaggio di un Giocatore. |
A part is cloned localmente da ReplicatedStorage attraverso Instance:Clone() in un 1> Class.LocalScript1> . | Un personaggio mago lancia un incantesimo attivando un Tool, su cui viene clonato un oggetto che include diversi effetti speciali . | La parte non viene replicata al Servere non è soggetta allo streaming out a meno che non la renda discendente di una parte che esiste sul Server. |
A part is reparented from ReplicatedStorage to the workspace via a LocalScript . | Un "cappello mago" è memorizzato in ReplicatedStorage . Quando un giocatore sceglie di giocare nella teamdel mago, il cappello viene spostato nel loro modello di personaggio tramite un LocalScript . | La parte rimane idonea per lo streaming in quanto viene dal server e viene replicata a ReplicatedStorage . Evita questo modello poiché causa un desincronizzazione tra il client e il Servere la parte potrebbe stream out; invece, clone la parte. |
Comportamento del modello
Se impostate ModelStreamingBehavior su Migliorato , il motore potrebbe streamare Modelli predefiniti ( 1> Nonatomici1> ) quando sono elegibili per streamare, potenzialmente liberando la memoria sul client e riducendo le istanze che richiedono aggiornamenti di proprietà.
Sotto migliorato modello comportamento di streaming, streaming out of Default ( Non atomico ) modelli basati su whether the model is 2> spaziale2> (contiene 5> Class.BasePart5> discendenti) o 8> non-spatiale8> (contiene no 1> Class.BasePart
- Un modello spaziale viene rilevato solo quando la sua ultima parte BasePart discendente viene rilevata, poiché alcune delle parti spaziali del modello possono essere vicino al focus del giocatore/replicazione e alcune lontane.
- Un modello non spaziale viene riprodotto solo quando un antenato viene riprodotto, paragonabile al comportamento di riproduzione del legacy.
Assemblaggi e Meccanismi
Quando almeno una parte di un Assembly è idonea per lo streaming in, tutte le parti dell'assemblaggio vengono anche Flusso. Tuttavia, un'assemblaggio non streamerà out finché
Nota che le assemblate con parti ancorate sono trattate leggermente in modo diverso dalle assemblate con solo parti non ancorate:
Composizione dell'assemblaggio | Comportamento di streaming |
---|---|
Parti non ancorate solo | L'intera assemblaggio viene inviato come un'unità atomica. |
Anchored parte radice | Solo le parti, gli accessori e le restrizioni necessarie per collegare le parti in streaming alla parte di base vengono streamed insieme. |
Ritardo di Tempo
Potrebbe esserci un leggero ritardo di ~10 millisecondi tra quando viene creata una parte sul server e quando viene replicata ai client. In ciascuno dei seguenti scenari, potrebbe essere necessario utilizzare WaitForChild() e altre tecniche invece di supporre che gli eventi e le aggiornamenti delle proprietà si svolgono sempre allo stesso tempo come l'aggiornamento del partecipante.
Scenario | Esempio | Comportamento di streaming |
---|---|---|
Un LocalScript fa un RemoteFunction chiamata 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 viene restituita al client, la parte potrebbe non ancora esistere, anche se la parte è vicino al focus del client e in un'area in streaming. |
A part is added to a character model on the server via a Script and a RemoteEvent is fired to a client. | Quando un giocatore si teamalla polizia, una parte del "police badge" memorizzata in ServerStorage viene clonata e attaccata al modello del personaggio del Giocatore. Un RemoteEvent viene attivato e ricevuto dal client del Giocatoreper aggiornare un elemento UI locale. | Although il client riceve il segnale di evento, non c'è garanzia che la parte sia già stata streamed 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 un goal, attivando un evento "goal scored". | Altri giocatori che sono vicini al goal possono vedere l'evento "goal scored" prima che la palla sia stata streamed a loro. |
Property di streaming
Le seguenti proprietà controllano come viene applicata la sincronizzazione delle istanze alla tua esperienza. Tutte queste proprietà sono non scriptabili e devono essere impostate sull'oggetto Workspace in Studio.
comportamento di modellazione
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 2> Class.Area di lavoro2> vengono inviati solo ai client quando necessario, potenzialmente velocizzando i tempi di join. Vedi 5>Comportamento
Modalità di integrazione della streaming
La tua esperienza può comportarsi in modi non intenzionali se un giocatore si muove in una regione del mondo che non è stata streamed a loro. La funzione streaming integrity offre un modo per evitare queste situazioni potenzialmente problematiche. Vedi la Enum.StreamingIntegrityMode documentazione per ulteriori dettagli.
Radius di streaming
La proprietà StreamingMinRadius indica il raggio attorno al personaggio del Giocatore(o ReplicationFocus ) in cui le istanze si stream in modo da ottenere la priorità più alta. Dovrebbe essere presa cura quando si aumenta il valore predefinito, poiché ciò richiederà più memoria e più band宽 del server a spese di altri componenti.
Radius di streamingTarget
La proprietà StreamingTargetRadius controlla la distanza massima dal personaggio del Giocatore(o ReplicationFocus ) in cui si stream in. Nota che il motore è autorizzato a conservare le istanze precedentemente caricate oltre il raggio di target, autorizzazione della memoria.
Un StreamingTargetRadius più piccolo riduce il carico di lavoro del server, poiché il server non streamerà in istanze aggiuntive oltre il valore impostato. Tuttavia, il target radius è anche la distanza massima che i giocatori saranno in grado di vedere il dettaglio completo della tua esperienza, quindi dovresti scegliere un valore che crea un'equilibrio piacevole tra questi.
StreamOut comportamento
La proprietà StreamOutBehavior imposta il comportamento streaming out in base a uno dei seguenti valori:
Impostazione | Comportamento di streaming |
---|---|
Predefinito | Comportamento predefinito, attualmente lo stesso di LowMemory . |
LowMemory | Il client solo streamizza parti in una situazione di bassa memoria e può rimuovere il contenuto 3D fino a quando non è presente il minimo radius. |
Opportunistico | Le regioni oltre StreamingTargetRadius possono essere rimosse sul client anche quando non c'è pressione di memoria. In questo modo, il client non rimuove mai le istanze che sono più vicine al raggio di destinazione, a meno che in situazioni di memoria bassa. |
Controlli di streaming per modello
Globally, the ModelStreamingBehavior Proprietàlets you control how models are streamed in on join. Inoltre, per evitare problemi con lo streaming su base per modello e minimizzare l'uso di WaitForChild() , puoi personalizzare how Models e i loro
Predefinito / Nonatomico
Quando un Model è impostato su Default o Nonatomico, il comportamento di streaming varia in base a se 2>ModelStreamingBehavior2> è impostato su 5> Default5> ( 8> Legacy8> ) o Model1> .
Modalità di bilanciamento del modello | Comportamento tecnico |
---|---|
Predefinito ( Eredità ) | Il modello viene replicato quando un giocatore si unisce. Ciò potrebbe comportare più istanze inviate durante il caricamento, più istanze memorizzate nella memoria e una complessità aggiuntiva per gli script che vogliono accedere ai discendenti del modello. Ad esempio, un singolo LocalScript dovrà utilizzare WaitForChild() all |
Migliorato | Il modello viene inviato solo quando necessario, potenzialmente velocizzando i tempi di join. |
Vedi Comportamento tecnico per ulteriori dettagli.
Atomico
Se un Model è cambiato in Class.Atomic, tutti i suoi discendenti vengono streamed insieme quando un discendente BasePart è idoneo. Di Risultato,
Un modello atomico viene generato solo quando tutte le sue parti discendenti sono elegibili per lo streaming, a cui punto l'intero modello viene generato insieme. Se solo alcune parti di un modello atomico di solito vengono generati, l'intero modello e i suoi discendenti rimangono sul client.
Script locale
-- Il modello atomico non esiste al momento del caricamento; usa WaitForChild()local model = workspace:WaitForChild("Model")-- Le parti discendenti fluttuano con il modello e sono immediatamente accessibililocal meshPart = model.MeshPartlocal part = model.Part
Persistente
I modelli persistenti non sono soggetti a normali flussi in o fuori. Vengono inviati come un'unità atomica completa poco dopo che il giocatore si unisce e prima che l'evento Class.Area di lavoro.PersistentLoaded Lanciare. I mod
Script locale
-- Il modello persistente non esiste al momento del caricamento; usa WaitForChild()local model = workspace:WaitForChild("Model")-- Le parti discendenti fluttuano con il modello e sono immediatamente accessibililocal meshPart = model.MeshPartlocal part = model.Part
Player Persistente
I modelli impostati su PersistentPerPlayer si comportano allo stesso modo come Persistent per i giocatori che sono stati aggiunti usando Model:AddPersistentPlayer() . Per gli altri giocatori, il comportamento è lo stesso di 1> Atomic1> . Puoi tornare indietro a un modello dal persistenza del giocatore tramite 4> Class.Model:RemovePersistentPlayer()</
Richiesta di area di streaming
Se impostate il CFrame di un personaggio giocatore in una regione che non è attualmente caricata, pausa di streaming avviene, se abilitato. Se conoscete che il personaggio si muoverà in una certa area, potete chiamare Player:RequestStreamAroundAsync() per richiedere che il server invii regioni in quella posizione al client.
I seguenti script mostrano come fire un evento remoto client-to-server per teletrasportare un giocatore all'interno di un Posto, rendendo alla richiesta di streaming prima di spostare il personaggio in un nuovo <a href="/reference/engine/datatype.cframe">Datatype.CFrame</a>.
Script - Teleportare il personaggio del giocatore
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Richiedi 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 fire l'evento remoto
teleportEvent.OnServerEvent:Connect(teleportPlayer)
Script locale - Evento remoto di Fire
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Fuori l'evento remototeleportEvent:FireServer(teleportTarget)
Rilevamento della streaming dell'istanza
In alcuni casi, è necessario rilevare quando un oggetto flusso in o fuori e reagire a quel fatto. Un modello utile per la rilevazione dello streaming è come segue:
Usando la sezione Etichetta delle proprietà di un'esempio, o il Tag Editor del Studio, assegna un tag CollectionService logico a tutti gli oggetti interessati.
Da un singolo LocalScript , rileva quando un oggetto contrassegnato flusso in o fuori attraverso GetInstanceAddedSignal() e GetInstanceRemovedSignal() , quindi gestire l'oggetto
Script locale - Servizio di streaming di raccoltalocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- Individua le parti attualmente in o fuori dal flusso di lavorofor _, 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)-- Loop dilickerwhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
Personalizzare 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 uno stato GUI or Intefaccia grafica utentepersonalizzato.
Script locale
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Disabilita modalità di pausa predefinita
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Mostra interfaccia utente personalizzata
else
-- Nascondi GUI or Intefaccia grafica utentepersonalizzata
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Livello di dettaglio del modello
Quando la modalità streaming è abilitata, Models al di fuori dell'area di streaming attualmente in modalità streamed non sarà visibile per impostazione predefinita. Tuttavia, puoi istruire il motore per rendere maggiormente visibili i meshi di pixelizzazione "impostore" per i modelli che non sono presenti sui client attraverso la proprietà LevelOfDetail Proprietàciascun modello.
Impostazione modello | Comportamento di streaming |
---|---|
StreamingMesh | Attiva la generazione asincrona di un mesh impostore per visualizzare quando il modello non è presente nei client. |
Disabilitato / Automatico | Il modello scompare quando è fuori dal raggio di streaming. |
Quando si utilizzano mesh imposter, notare il Seguendo:
- Le maglie impostore sono progettate per essere viste a 1024 studs away from the camera o più. Se hai ridotto StreamingTargetRadius a un valore molto più piccolo come 256, le maglie impostore potrebbero non essere visivamente accettabili per il modello che sostituiscono.
- Se un modello e i suoi modelli discendenti sono tutti impostati su StreamingMesh , solo il modello antenato di livello superiore viene visualizzato come un Mesh, magliaimpostore, avvolgendo tutte le geometrie sotto l'antenato così come i suoi modelli discendenti. Per le migliori Prestazione, si consiglia di utilizzare Disabilitato per i modelli discendenti.
- Le texture non sono supportate; le maglie impostore sono rendute come maglie lisce.
- Mentre un Model non è completamente streamed in, the imposter mesh è renderizzato invece di singole parti del modello. Una volta che tutte le parti individuali sono streamed in, essi rendono e il mesh imposter è ignorato.
- Le maglie imposter non hanno alcun significato fisico e agiscono come non esistenti per quanto riguarda raycasting, detection delle collisioni e simulazione di fisica.
- Modificare un modello in Studio, come aggiungere/删除/repositioning child parts o resetting colori, aggiorna automaticamente la Mesh, magliarappresentante.