Streaming dell'istanza

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

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.

The Properties window with the StreamingEnabled property enabled.

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:

Quindi, durante il Partita, il server può inviare le istanze necessarie al client, come sono necessarie.

Diagram showing when various instances and their descendants in the Workspace stream in.
1 Il terreno viene trattato in modo unico, in quanto l'istanza si replica al client quando l'esperienza viene caricata, ma le regioni del terreno vengono visualizzate solo quando necessario

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 .

The Properties window with the ModelStreamingBehavior property set to Default.

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.

Diagram showing default model stream in behavior.

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:

ScenarioEsempioComportamento 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à.

The Properties window with the ModelStreamingBehavior property set to Improved.

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'assemblaggioComportamento di streaming
Solo parti non ancorateL'intera assemblata viene inviata come unità atomica.
Ancorato parte radice ancorataSolo 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.

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

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

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:

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

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

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

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

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

  1. Usando la sezione Tag delle proprietà di un'esempioo l'editor di tag di Studio , assegna un tag logico a tutti gli oggetti interessati.

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

    local CollectionService = game:GetService("CollectionService")
    local tagName = "FlickerLightSource"
    local random = Random.new()
    local flickerSources = {}
    -- Rileva attualmente e nuove parti contrassegnate in streaming in o fuori
    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)
    -- Ciclo lampeggiante
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.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.

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.
Modello attuale
The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.
Retina a bassa risoluzione "imposter"
Impostazione del modelloComportamento 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.