Instanz-Streaming

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

In-Experience- Instanz-Streaming ermöglicht es der Roblox-Engine, 3D-Inhalte und verwandte Instanzen in Regionen der Welt dynamisch zu laden und zu entladen. Dies kann die Gesamterlebnis des Spielers in mehreren Weisen verbessern, z. B.:

  • Schnellere Beitrittszeiten — Spieler können in einem Teil der Welt beginnen zu spielen, während mehr der Welt im Hintergrund geladen wird.
  • Erinnerungs-Effizienz — Erinnerungen können auf Geräten mit weniger Speicher gespielt werden, da der Inhalt dynamisch gestreamt wird und mehr immersive und detaillierte Welten auf einer breiteren Palette von Geräten gespielt werden können.
  • Verbesserte Leistung — Bessere Bildraten und Erfüllung, da der Server weniger Zeit und Bandbreite für die Synchronisierung von Änderungen zwischen der Welt und den Spielern in der Welt verbringen kann. Clients verbringen weniger Zeit, um Instanzen zu aktualisieren, die derzeit nicht relevant für den Spieler:insind.
  • Detaillierungsgrad — Ferne Modelle und Terrain bleiben auch wenn sie nicht auf Clients gestreamt werden, noch sichtbar, wodurch die Erfahrung optimiert bleibt, ohne die Hintergrundvisualien völlig aufzuopfern.

Streaming aktivieren

Die Instanz-Streaming wird durch die StreamingEnabled Eigenschaft des Workspace-Objekts in Studio aktiviert. Diese Eigenschaft kann nicht in einem Skript, das. PL: die Skriptsfestgelegt werden. Streaming wird standardmäßig für neue Plätze in Studio aktiviert.

The Properties window with the StreamingEnabled property enabled.

Sobald aktiviert, wird empfohlen, dass Sie sich an die folgenden Praktiken halten:

  • Da Clients normalerweise nicht die gesamte Workspace lokal haben, verwenden Sie das entsprechende Werkzeug/API, um sicherzustellen, dass Instanzen vor dem Versuch, auf sie zuzugreifen, in einem LocalScript vorhanden sind. Zum Beispiel verwenden Sie per-Modell-Streaming-Steuerelemente,
  • Minimieren Sie die Platzierung von 3D-Inhalten außerhalb von Workspace . Inhalte in Containern wie ReplicatedStorage oder ReplicatedFirst sind nicht für den Streaming-Dienst geeignet und können sich negativ auf die Verbindungszeit und die Erinnerungsnutzung auswirken.
  • Wenn Sie den Charakter eines Spieler:inbewegen, indem Sie seine CFrame setzen, tun Sie dies von einem Server-seitigen Script und verwenden Sie Streaming-Anfragen, um Daten schneller um die neue Position des Spielers zu laden.
  • Setzen Sie manuell den ReplicationFocus des Spieler:innur in einzigartigen Situationen, wie in Erlebnissen, die keinen Player.Character verwenden. In diesen Fällen stellen Sie sicher, dass der Fokus in der Nähe des Objekts ist, das der Spieler steuert, um sicherzustellen, dass der Inhalt immer um den Interaktionspunkt des Spieler:infließt.

Technisches Verhalten

Streaming in

Standardmäßig werden die Instanzen in der Workspace wenn ein Spieler einer Erfahrung mit dem Streaming-Instanz aktiviert ist, auf den Client repliziert, mit Ausnahme von dem gefolgte Profile:

Dann, während des Gameplay, kann der Server die erforderlichen Instanzen zum Client streamen, da sie benötigt werden.

Diagram showing when various instances and their descendants in the Workspace stream in.
1 Terrain wird einzigartig behandelt, in dem die Instanz beim Laden der Erfahrung auf den Client repliziert, aber Terrain-Regionen nur dann gestreamt werden, wenn sie erforderlich sind

Modell-Verhalten

Modelle auf nicht-Standard-Verhalten wie Atom- -Strahl unter speziellen Regeln gesetzt, wie in Per-Model-Streaming-Steuerelemente beschrieben. jedoch, Standard (nicht-atomare) -Modelle werden anders gesendet, basierend darauf, ob ModelStreamingBehaviour auf 1> Standard1> (4> Legacy4> ) oder 7> Improved

The Properties window with the ModelStreamingBehavior property set to Default.

Wenn ModelStreamingBehavior auf Standard / Legacy eingestellt ist, repliziert sich der 1> Class.Model Container und seine nicht-raumzeitigen Nachkommen wie 4> Class.Script|Scripts4> auf dem Client, wenn der Spieler beitritt. Dann, wenn Sie elegible sind, streamen die Modell-7>

Diagram showing default model stream in behavior.

Out-Streaming

Während des Gameplaykann ein Client Regionen auslassen (entfernen Sie sie aus dem Charakter des Spieler:inWorkspace ) und die in ihnen enthaltenen BaseParts basierend auf dem Verhalten, das von StreamOutBehavior festgelegt. Der Prozess beginnt

Wenn eine Instanz ausgeht, wird sie mit nil in Verbindung gebracht, damit jeder bestehende Luau-Zustand wiederverbindet, wenn die Instanz zurückgeht. Ergebniswerden Entfernungszeichen wie Class.Instance.ChildRemoved|ChildRemoved</

Um die Stream-Ausgabe weiter vorherzusagen, untersuchen Sie diese Szenarien:

SzenarioBeispielStreaming-Verhalten
Ein Teil wird lokal durch Class.Instance.new() in einem Instance.new() erstellt.In einem "Capture the Markierung"-Spiel erstellen und fügen Sie blaue Helmetteile an alle Spieler auf dem blauen Team durch ein LocalScript .Das Teil wird nicht auf den Server repliziert und ist von der Verbreitung aus ganz abgesehen , es sei denn, du hast es zu einem Nachkommen eines Teils, der auf dem Server existiert, wie z. B. ein Teil innerhalb eines Modelleines Spieler:in.
Ein Teil wird klont lokal von ReplicatedStorage durch Instance:Clone() in einem 1> Class.LocalScript1> .Ein Zauberer-Charakter wirkt einen Zauber, indem er einen Tool aufruft, auf den ein Objekt, das mehrere Spezialeffekte enthält, kopiert wird, und das der Arbeitsbereich des Zauberers in der Position des Zauberers steht.Das Teil wird nicht auf den Server repliziert und ist von der Verbreitung aus ganz abgesehen , es sei denn, du hast es zu einem Nachkommen eines Teils, der auf dem Server existiert, gemacht.
Ein Teil ist reparented von ReplicatedStorage zum Arbeitsbereich über einen LocalScript.Ein "Zaubererhut" wird in ReplicatedStorage gespeichert. Wenn ein Spieler sich für ein Spiel in dem Team des Zauberers entscheidet, wird der Hut in sein Charaktermodell über ein LocalScript versetzt.Der Teil bleibt für den Streaming-Ausstoß elegibel, da er vom Server stammt und in ReplicatedStorage repliziert wurde. Vermeiden Sie dieses Muster, da dies eine Desync zwischen dem Client und dem Server verursacht und der Teil streamt; stattdessen klonen Sie den Teil.

Modell-Verhalten

Wenn Sie ModelStreamingBehavior auf Verbessert setzen, kann der Engine Standard ( 1> Nichtatomische1> ) Modelle streamen, wenn sie berechtigt sind, stream auszugehen, und dies möglicherweise Freier Speicher auf dem Client und Reduzieren der Instanzen, die Eigenschaftsaktualisierungen benötigen.

The Properties window with the ModelStreamingBehavior property set to Improved.

Unter Verbessertem Modell- Streaming-Verhalten, Streaming aus Standard- ( nichtatomaren ) -Modellen basiert auf der Tatsache, dass das Modell 1>raumlich1> (enthält 4> Class.BasePart4> -Nachkommen) oder 7> nichtraumlos7> (enthält keine 0> Class

  • Ein Raummodell wird nur vollständig ausgegeben, wenn seine letzten verbleibenden BasePart -Descendant-Strahlen ausgegeben werden, da einige der Raumteile des Modells in der Nähe des Spielers/der Replikation stehen und einige weit entfernt sind.
  • Ein nicht-raumzeitliches Modell streamt nur aus, wenn ein Vorgänger streamt, was der ähnelt Verhalten wie Legacy-Streaming.

Assemblies und Mechanismen

Wenn mindestens ein Teil einer Assembly zum Streaming berechtigt ist, streamt alle Teile derAssembly auch. Allerdings streamt eineAssembly nicht, bis alle Teile der Asia-Server zum Streaming berechtigt sind. Während des Streamings fließen

Beachten Sie, dass Montagen mit verankerten Teilen etwas anders behandelt werden als Montagen mit nur nicht verankerten Teilen:

Komponenten-ZusammenstellungStreaming-Verhalten
Nur abgeankerte TeileDie gesamte Montagemaschine wird als Atom-Einheit gesendet.
Verankert WurzelteilNur die Teile, Anhänge und Einschränkungen, die benötigt werden, um die gestreamten Teile an die Wurzelteile zu binden, werden in Zusammenhang gebracht.

Zeitverzögerung

Es kann eine leichte Verzögerung von ~10 Millisekunden zwischen der Erstellung einer Teil auf dem Server und dem Zeitpunkt, an dem sie auf Clients repliziert wird, geben. In jedem der folgenden Szenarien müssen Sie WaitForChild() und andere Techniken verwenden, anstatt zu behaupten, dass Ereignis- und Eigenschaftsaktualisierungen immer in der selben Zeit wie die Teil- Streaming-Sitzung stattfinden.

SzenarioBeispielStreaming-Verhalten
Ein LocalScript macht eine RemoteFunction Anruf auf den Server, um ein Teil zu erstellen.Ein Spieler aktiviert lokal einen Tool, um ein Teil auf dem Server zu spawnen, mit dem alle Spieler interagieren können.Wenn die Remote-Funktion zum Client zurückkehrt, existiert der Teil möglicherweise noch nicht, obwohl der Teil in der Nähe des Client-Fokus und innerhalb eines Streamed-Bereichs ist.
Ein Teil wird über ein Script und ein RemoteEvent an ein Charaktermodell auf dem Server hinzugefügt.Wenn ein Spieler dem Teambeitritt, wird ein "Polizei-Abzeichen"-Teil, der in ServerStorage gespeichert ist, geklont und an das Modelldes Spieler:inangehängt. Ein RemoteEvent wird von dem Client des Spieler:inausgeführt, um ein lokales UI-Element zu aktualisieren.Obwohl der Client das Ereignis-Signal erhält, gibt es keine Garantie, dass das Teil bereits an diesen Client gestreamt wurde.
Ein Teil kollidiert mit einer unsichtbaren Region auf dem Server und aktiviert ein RemoteEvent auf dem Client.Ein Spieler schießt einen Fußball in das Tor, was ein "erzieltes" Ereignis auslöst.Andere Spieler, die dem Ziel nah sind, können das "Ziel erzielte" -Ereignis sehen, bevor der Ball an sie gestreamt wird.

Streaming-Eigenschaften

Die folgenden Eigenschaften steuern, wie die Instanz-Übertragung auf Ihr Erlebnis angewendet wird. Alle dieser Eigenschaften sind nicht-skriptbar und müssen auf dem Arbeitsbereich-Objekt in Studio festgelegt sein.

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

Modell-Streaming-Verhalten

Steuert, ob Standard ( Nichtatomar ) Modelle repliziert werden, wenn ein Spieler beitritt, oder nur gesendet werden, wenn nötig. Wenn diese Eigenschaft auf Verbessert gesetzt ist, werden nur Modelle in 1> Class.Arbeitsbereich1> gesendet, wenn nötig, und das möglicherweise die Beitrittszeiten beschleunigt. Siehe 4> Technisches Verhalten</

Streaming Integrity Mode

Ihr Erlebnis kann in unbeabsichtigten Weise verhalten, wenn ein Spieler in eine Region der Welt bewegt, die nicht an ihn gestreamt wurde. Die Streaming- Integrität-Funktion bietet einen Weg, um diese potenziell problematischen Situationen zu vermeiden. Bitte sehen Sie die Enum.StreamingIntegrityMode-Dokumentation für weitere Informationen.

Minradius-Strreaming

Die StreamingMinRadius -Eigenschaft zeigt den Radius um den Charakter des Spieler:in(oder Class.Player.ReplicationFocus|ReplicationFocus) in der die Streams in der höchsten Priorität in der Anwendung sind. Vorsicht beim Erhöhen des Standard ist, da dies mehr Speicher und mehr Server-Bandbreite im Sinne anderer Komponenten erfordern wird.

TargetRadius

Die StreamingTargetRadius -Eigenschaft kontrolliert die maximale Entfernung vom Charakter des Spieler:in(oder Class.Player.ReplicationFocus|ReplicationFocus) in denen sich die Streams in ähnlichen Fällen streamen. Beachten Sie, dass der Engine ursprünglich geladene Instanzen jenseits des Zielradius behalten kann, Memorie erlaubt.

Ein kleineres StreamingTargetRadius reduziert die Serverlast, da der Server nicht in zusätzlichen Instanzen über dem festgelegten Wert streamen wird. Die Zielreichweite ist jedoch auch die maximale Entfernung, die Spieler von deinem Erlebnis sehen können, so dass du einen Wert auswählen solltest, der ein schönes Gleichgewicht zwischen diesen schafft.

StreamOutVerhalten

Die StreamOutBehavior-Eigenschaft setzt das Streaming-aus-Verhalten-Verhalten entsprechend einem der folgenden Werte:

EinstellungenStreaming-Verhalten
Standard Standardverhalten, derzeit dasselbe wie LowMemory .
Niedrige Erinnerung Der Client streamt nur Teile in einer niedrigen Erinnerungs Situation und kann 3D-Inhalte entfernen, bis der minimale Radius vorhanden ist.
Opportunistisch Regionen jenseits von StreamingTargetRadius können auf dem Client entfernt werden, auch wenn keine MemorißPresse vorhanden ist. In diesem Modus entfernt der Client niemals Instanzen, die näher als der Zielradius sind, außer in niedrigen MemorißPresse-Situationen.

Per-Model- Streaming-Steuerelemente

Weltweit ermöglicht die ModelStreamingBehaviour-Eigenschaft, wie Modelle beim Beitreten gestreamt werden. Darüber hinaus, um Probleme mit dem Streaming auf einer pro-modell-Basis zu vermeiden und die Verwendung von WaitForChild() zu minimieren, können Sie die Eigenschaftenändern, wie

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

Standard/Nicht-Atomar

Wenn ein Model auf Standard oder Nichtatomar eingestellt ist, variiert das Streaming-Verhalten basierend darauf, ob 1> ModelStreamingBehaviour1> auf 4> Standard4> ( 7> Legacy7> ) oder 0> Improved0> eingestellt ist.

Modell-Streaming-VerhaltenTechnisches Verhalten
Standard ( Legacy )Das Modell wird replicated, wenn ein Spieler beitritt. Dies kann dazu führen, dass mehr Instanzen gesendet werden, mehr Instanzen in den Speicher gespeichert werden und zusätzliche Komplexität für Skripte, die auf den Nachkommen des Modells zugreifen möchten, entsteht. Zum Beispiel muss ein separater LocalScript auf einem Nachkommen WaitForChild() innerhalb
Verbessert Das Modell wird nur gesendet, wenn es benötigt wird, was die Beitrittszeiten potenziell beschleunigen kann.

Siehe technisches Verhalten für weitere details.

Atomar

Wenn ein Model in Atomar geändert wird, werden alle seine Nachkommen in einem zusammen gestreamt, wenn ein Nachkommen BasePart ist, das auf

Ein Atommodell wird nur ausgegeben, wenn alle seine Nachkommen Teile für den Streaming-Ausfall berechtigt sind, und zwarumdem die gesamte Modell-Kette zusammen ausgegeben wird. Wenn nur einige Teile eines Atommodells normalerweise Streaming-Ausgaben erhalten, bleibt das gesamte Modell und seine Nachkommen auf dem Client.

A diagram showing Atomic model streaming along with children.
Lokales Skript

-- Atommodell existiert beim Laden nicht; verwende WaitForChild()
local model = workspace:WaitForChild("Model")
-- Absteigende Teile stream in mit dem Modell und sind sofort zugänglich
local meshPart = model.MeshPart
local part = model.Part

Dauerhaft

PersistenteModelle sind nicht auf normale Streaming in oder aus. Sie werden als vollständige Atomeneinheit gesendet, sobald der Spieler beitritt und vor dem Workspace.PersistentLoaded -Ereignis. PersistenteModelle und ihre Nach

A diagram showing Persistent model streaming along with children.
Lokales Skript

-- Das persistente Modell existiert beim Laden nicht; verwenden Sie WaitForChild()
local model = workspace:WaitForChild("Model")
-- Absteigende Teile stream in mit dem Modell und sind sofort zugänglich
local meshPart = model.MeshPart
local part = model.Part

persistentPerSpieler

Modelle auf PersistentPerPlayer verhalten sich so, als wäre Persistent für Spieler, die mit Model:AddPersistentPlayer() hinzugefügt wurden, dasselbe. Für andere Spieler ist das Verhalten so, als wäre 2> Atomar2>. Sie können ein Model von der persistenz eines Spielers über 5> Class.Model:RemovePersistentPlayer() 5> zurückrufen.

Area-Streaming anfordern

Wenn Sie den CFrame eines Spielerscharakters in eine Region setzen, die derzeit nicht geladen ist, wird die Stream-Pause gestreamt, wenn es aktiviert ist. Wenn Sie den Charakter beweisen, dass er sich in einen bestimmten Bereich bewegt, können Sie Class.Player:RequestStreamAroundAsync() 1> aufrufen, um zu verlangen, dass der Server Regionen in diesem Bereich an den Client sendet1>.

Die folgenden Skripte zeigen, wie man ein client-to-server Remote-Ereignis feuert, um einen Spieler innerhalb eines Ortes zu teleportieren, der bei der Streaming-Anfrage vor dem Verschieben des Charakters in ein neues CFrame liefert.

Script - Teleportieren Spieler Charakter

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Fordern Sie die Streaming-Lokalisierung um die Ziel位置 an
player:RequestStreamAroundAsync(teleportTarget)
-- Teleportieren Sie den Charakter
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Rufe die Teleport-Funktion auf, wenn der Client das Remote-Ereignis auslöst
teleportEvent.OnServerEvent:Connect(teleportPlayer)
Lokales Skript - Feuer-Remote-Ereignis

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local teleportTarget = Vector3.new(50, 2, 120)
-- Feuere das Remote-Ereignis
teleportEvent:FireServer(teleportTarget)

Instanz-Streaming erkennen

In einigen Fällen ist es notwendig, zu erkennen, wenn ein Objekt einsteigt oder ausgeht und auf dieses Ereignis reagiert. Ein nützliches Muster für die Stream-Erkennung ist wie folgt:

  1. Mit dem Tags-Abschnitt der Eigenschaften eines Instanzen oder mit dem Tag-Editor von Studio wird ein logisches CollectionService-Tag für alle betroffenen Objekte zugewiesen.

  2. Von einem einzigen LocalScript , entdecken Sie, wenn ein markiertes Objekt durch GetInstanceAddedSignal() und GetInstanceRemovedSignal() strreamt, und behandeln Sie das Objekt entsprechend.

    Lokales Skript - CollectionScript-Streaming-Erkennung

    local CollectionService = game:GetService("CollectionService")
    local tagName = "FlickerLightSource"
    local random = Random.new()
    local flickerSources = {}
    -- Erkennen Sie derzeit und neue getaggte Teile, die in oder ausgestreamt werden
    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)
    -- Flicker-Loop
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.wait(0.05)
    end

Anpassung des Pause-Bildschirms

Die Player.GameplayPaused-Eigenschaft zeigt den aktuellen Pause-Status des Spieler:inan. Dieses Eigenschaft kann mit einer Class.Instance:GetPropertyChangedSignal()|GetPropertyChangedSignal() -Verbindung verwendet werden, um eine benutzerdefinierte grafische Benutzeroberflächeanzuzeigen oder auszublenden.

Lokales Skript

local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Deaktivieren Sie die Standard-Pause-Modalk
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Benutzerdefinierte grafische Benutzeroberflächeanzeigen
else
-- grafische Benutzeroberflächeausblenden
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)

Modellierungsgrad der Detaillierung

Wenn Streaming aktiviert ist, werden Models außerhalb der derzeit gestreamten Bereich nicht standardmäßig sichtbar. jedoch können Sie die Engine bitten, niedrigere Auflösung "imposter"-Meshes für Modelle zu rendern, die nicht auf Clients durch jedes Modell's LevelOfDetail Eigenschaftennicht vorhanden sind.

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.
Aktuelles Modell
The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.
Niedrige Auflösung "imposter"-Mesh
Modell-EinstellungenStreaming-Verhalten
StreamingMesh Aktiviert die asynchrone Generierung eines Betrüger-Messhes, um sie anzuzeigen, wenn das Modell nicht auf Clients vorhanden ist.
Deaktiviert / Automatisch Das Modell verschwindet, wenn es sich außerhalb des Streaming-Radius befindet.

Bei der Verwendung von Imposter-Meshes beachten Sie gefolgte Profile:

  • Imposter-Meshes sind so konzipiert, dass sie 1024 Studs entfernt von der Kamera oder weiter entfernt zu sehen sind. Wenn Sie StreamingTargetRadius auf einen viel kleineren Wert wie 256 reduziert haben, können imposter-Meshes für das Modell, das sie ersetzen, möglicherweise nicht visuell ansprechend sein.
  • Wenn ein Modell und seine Nachkommenmodelle auf StreamingMesh eingestellt sind, werden nur die oberste Stufen-Vormodellierungsmodelle als Imposter-Meshes gerendert, die alle Geometrien unter dem Vorgänger sowie seine Nachkommen umwickeln. Für eine bessere Erfüllungwird empfohlen, 1> Disabled1> für Nachkommenmodelle zu verwenden.
  • Texturen werden nicht unterstützt; Imposter-Meshes werden als glatte Meshes gerendert.
  • Während ein Model nicht vollständig gestreamt ist, wird die Imposter-Maschine stattdessen rendert, anstatt einzelne Teile des Modells. Sobald alle einzelnen Teile gestreamt sind, werden sie rendert und die Imposter-Maschine ignoriert.
  • Imposter-Meshes haben keine physische Bedeutung und agieren als nicht existierend in Bezug auf Raycasting, Kollisionserkennung und Physiksimulation.
  • Das Bearbeiten eines Modells in Studio, wie das Hinzufügen/Löschen/Verlagern von Kindern Teilen oder das Festlegen von Farben, aktualisiert automatisch das Repräsentant-Mesh.