Diffusion en continu

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

En cours d'expérience, la lecture d'instance en continu permet au moteur Roblox de charger et décharger dynamiquement du contenu 3D et des instances liées dans des régions du monde. Cela peut améliorer l'expérience du joueur dans plusieurs façons, par exemple :

  • Temps de chargement plus rapide des joueurs — Les joueurs peuvent commencer à jouer dans une partie du monde pendant que plus de la monde se charge dans le fond.
  • Efficacité de la mémoire — Les expériences peuvent être jouées sur des appareils avec moins de mémoire, car le contenu est diffusé dynamiquement dans et hors. Des mondes plus immersifs et détaillés peuvent être joués sur une plus grande gamme d'appareils.
  • Amélioration des performances — Meilleures taux de cadence d'exécution et des performances, car le serveur peut passer moins de temps et de bande de connexion à synchroniser les changements entre le monde et les joueurs dans le monde. Les clients passent moins de temps à mettre à jour les instances qui ne sont pas actuellement pertinentes pour le joueur.
  • Niveau de détail — Les modèles distants et le terrain restent visibles même lorsqu'ils ne sont pas diffusés aux clients, ce qui optimise l'expérience sans sacrifier complètement les visuels de fond.

Activer le streaming

Le streaming d'instance est activé via la propriété StreamingEnabled de l'objet Espace de travail dans Studio. Cette propriété ne peut pas être définie dans un script. Le streaming est activé par défaut pour les nouveaux endroits créés dans Studio.

The Properties window with the StreamingEnabled property enabled.

Une fois activé, il est recommandé de respecter les pratiques suivantes :

  • Puisque les clients n'auront généralement pas l'ensemble de Workspace disponible localement, utilisez le bon outil/API pour vous assurer que des instances existent avant d'essayer d'accéder à elles dans un LocalScript . Par exemple, utilisez permettre le contrôle du streaming du modèle, 2>détecter le streaming du mod
  • Minimisez le placement du contenu 3D en dehors de Workspace. Le contenu dans des conteneurs tels que ReplicatedStorage ou ReplicatedFirst n'est pas éligible pour le streaming et peut affecter négativement le temps d'ajout et l'utilisation de la mémoire.
  • Si vous déplacez le personnage d'un joueur en définissant son CFrame, faites-le dans un Script côté serveur et utilisez les demandes de lecture en continu pour charger plus rapidement les données autour de l'emplacement du nouveau personnage.
  • Défini manuellement le ReplicationFocus du joueur uniquement dans des situations uniques telles que dans les expériences qui ne utilisent pas de Player.Character . Dans ces cas, assurez-vous que le focus est près de l'objet(s) que le joueur contrôle pour assurer le flux de contenu autour du point d'interaction du joueur.

Comportement technique

En direct

Par défaut, lorsqu'un joueur rejoint une expérience avec une instance de diffusion en continu activée, les instances dans le Workspace sont répliquées sur le client, excluant la suivre:

Puis, pendant le partie, le serveur peut diffuser les instances nécessaires au client, à mesure qu'elles sont nécessaires.

Diagram showing when various instances and their descendants in the Workspace stream in.
1 Terrain est traité de manière unique, dans laquelle l'instance se réplique sur le client lorsque l'expérience se charge, mais les régions du terrain ne s'écoulent que lorsque nécessaire

Comportement du modèle

Les modèles définis pour un comportement non par défaut comme Atomique dans le sous-modèle Per-Model Streaming Controls . Cependant, les modèles par défaut (non atomiques) sont envoyés différemment en fonction de si ModelStreamingBehaviour

The Properties window with the ModelStreamingBehavior property set to Default.

Lorsque ModelStreamingBehavior est réglé sur par défaut / héritage , le conteneur 1> Class.Model1> et ses descendants non spatiaux tels que 4> Class.Script|Scripts4> se répliquent sur le client lorsque le joueur rejoint. Puis, lorsque cela est éligible

Diagram showing default model stream in behavior.

Mise en ligne

Pendant le partie, un client peut diffuser des régions (Workspace) et les régions BaseParts contenues dans elles, en fonction du comportement défini par StreamOutBehavior. Le processus commence avec les régions les plus éloignées du personnage du joueur (ou

Lorsqu'une instance se termine, il est parenté à nil afin que tout état Luau existant se reconnecte si l'instance se termine. Par resultats, les signaux de suppression tels que Class.Instance.ChildRemoved|Class.Instance.DescendantRemoving

Pour anticiper la sortie de la trombe, examinez ces scénarios :

ScénarioExempleComportement de génération
Une partie est créée localement via Class.Instance.new() dans un Instance.new() .Dans un jeu "Capture the indicateur, marquer", vous créez et attachez des pièces de casque bleu à tous les joueurs de l'équipe bleue via un LocalScript .La partie n'est pas répliquée sur le serveur, et elle est exemptée du streaming out à moins que vous la fassiez descendante d'une partie existante sur le serveur, telle qu'une partie dans le modèlisationde personnage d'un joueur.
Une partie est clonée localement à partir de ReplicatedStorage via Instance:Clone() dans un 1> Class.LocalScript1> .Un personnage de magicien lance un sort en activant un Tool, lequel contient plusieurs effets spéciaux Class.ReplicatedStorage, et dont l'objet parent est la position de l'espace de travail du magicien.La partie n'est pas répliquée sur le serveur et elle est exemptée de la sortie de unless vous la rendez descendant d'une partie existante sur le serveur.
Une partie est parentée de ReplicatedStorage à l'espace de travail via un LocalScript.Un « chapeau de magicien » est stocké dans ReplicatedStorage. Lorsqu'un joueur choisit de jouer dans l'équipe du magician, le chapeau est déplacé dans leur modèle de personnage via un LocalScript.La partie reste éligible pour le streaming puisqu'elle vient du serveur et a été répliquée à ReplicatedStorage. Évitez ce modèle car il cause un décalage entre le client et le serveur et la partie peut décaler ; au lieu de cela, clonez la partie.

Comportement du modèle

Si vous avez défini ModelStreamingBehavior sur Amélioré , le moteur peut streamer des modèles par défaut ( 1> non atomiques1> ) lorsqu'ils sont éligibles à stream, ce qui peut libérer de la mémoire sur le client et réduire les instances qui nécessitent des mises à jour de propriété.

The Properties window with the ModelStreamingBehavior property set to Improved.

Sous amélioré le comportement de génération du modèle, le comportement de génération des modèles non atomique (contient Class.BasePart descendants) ou 1>non atomique1> (contient pas de 4> Class.BasePart4> descendants) est basé sur le fait que le modèle est 7>physique7>

  • Un modèle spatial ne s'écoule que lorsque son dernier descendant BasePart descendant s'écoule, car certaines parties spatiales du modèlisationpeuvent être proches du focus du joueur/réplication et d'autres éloignées.
  • Un modèle non spatial ne s'écoule que lorsqu'un ancêtre s'écoule, ce qui correspond à la conduite de génération de l'ancêtre.

Assemblées et mécanismes

Lorsque au moins une partie d'une assemblage est éligible pour le streaming, toutes les parties de l'assemblage sont également flux. Cependant, un assemblage ne peut pas streamer sors</

Notez que les assemblages avec des parties ancrées sont traités légèrement différemment que les assemblages avec des parties non ancrées :

Composition de l'assemblageComportement de génération
Parties non ancrées seulementTout l'assemblage est envoyé comme une unité atomique.
Partie racine ancrée racineSeules les parties, les accessoires et les contraintes nécessaires pour lier les parties diffusées à la partie racine ne sont pas diffusées ensemble.

Délai de Timing

Il peut y avoir une légère延迟 de ~10 millisecondes entre quand une partie est créée sur le serveur et quand elle est répliquée aux clients. Dans chacun des scénarios suivants, vous devrez peut-être utiliser WaitForChild() et d'autres techniques plutôt que d'assumer que les événements et les mises à jour de propriétés se produisent toujours au même moment que la partie diffuse.

ScénarioExempleComportement de génération
Un LocalScript fait un RemoteFunction appel au serveur pour créer une partie.Un joueur active un Tool localement pour générer une partie sur le serveur que tous les joueurs peuvent voir et interagir avec.Lorsque la fonction à distance est renvoyée au client, la partie n'existe peut-être pas encore, même si la partie est près du focus du client et dans une zone de visionnement.
Une partie est ajoutée à un modèle de personnage sur le serveur via un Script et un RemoteEvent est tiré sur un client.Lorsqu'un joueur rejoint la équipe, une partie « police » stockée dans ServerStorage est clonée et jointe au modèlisationde personnage du joueur. Un RemoteEvent est lancé et reçu par le client du joueur pour mettre à jour un élément local de l'interface utilisateur.Bien que le client reçoive le signal d'événement, il n'y a aucune garantie que la partie ait déjà été diffusée à ce client.
Une partie se heurte à une région invisible sur le serveur et déclenche un RemoteEvent sur le client.Un joueur frappe un ballon de football dans un but, déclenchant un événement "but maré"..Les autres joueurs qui sont près de la porte peuvent voir l'événement "but marqué" avant que la balle ne soit diffusée vers eux.

Propriétés de Diffusion

Les propriétés suivantes contrôlent la façon dont le flux d'instance s'applique à votre expérience. Toutes ces propriétés sont non scriptables et doivent être définies sur l'objet Espace de travail dans Studio.

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

Modèle de comportement de génération

Contrôle si les modèles par défaut ( non atomique ) sont répliqués lorsqu'un joueur rejoint, ou envoyés uniquement lorsque nécessaire. Si cette propriété est réglée sur améliorée, les modèles dans 2>Class.Workspace2> ne seront envoyés que lorsque nécessaire, ce qui potentiellement accélérera les temps d'ajout. Voir 5>

Mode de confidentialité des diffusions

Votre expérience peut se comporter de manières inintentionnelles si un joueur se déplace dans une région du monde qui n'a pas été diffusée à eux. La fonctionnalité Streaming integrity offre une façon d'éviter ces situations potentiellement problématiques. Veuillez consulter la Enum.StreamingIntegrityMode documentation pour plus de détails.

Minradius de Diffusion

La propriété StreamingMinRadius indique le rayon autour duquel les flux se produisent autour du personnage du joueur (ou ReplicationFocus ) dans lesquels les flux sont les plus prioritaires. La précaution doit être prise lors de l'augmentation du paramètre par défaut, car cela nécessitera plus de mémoire et plus de bande de serveur au détriment des autres composants.

Rayon de cible de montage

La propriété StreamingTargetRadius contrôle la distance maximale à partir du personnage du joueur (ou Class.Player.ReplicationFocus|ReplicationFocus) dans lequel les flux se déroulent. Remarquez que le moteur est autorisé à conserver les instances précédemment chargées au-delà du rayon cible, autorisation de mémoire.

Un plus petit StreamingTargetRadius réduit le travail du serveur, car le serveur ne sera pas diffuser dans des instances supplémentaires au-delà de la valeur définie. Cependant, le rayon cible est également la distance maximale que les joueurs pourront voir le détail complet de votre expérience, vous devez donc choisir une valeur qui crée un bon équilibre entre ces deux.

Comportement de génération

La propriété StreamOutBehavior définit le comportement stream out suivant l'un des valeurs suivantes :

ParamètreComportement de génération
Par défaut Comportement par défaut, actuellement le même que LowMemory .
Mémoire faible Le client ne diffuse que des parties dans une situation de faible mémoire et peut supprimer le contenu 3D jusqu'à ce que le minimum soit présent.
Opportuniste Les régions en dehors de StreamingTargetRadius peuvent être supprimées sur le client même lorsqu'il n'y a pas de pression de mémoire. Dans ce mode, le client ne supprime jamais les instances qui sont plus proches que le rayon cible, sauf dans les situations de faible mémoire.

Commandes de contrôle du flux par modèle

Dans le monde, la propriété ModelStreamingBehavior vous permet de contrôler comment les modèles sont diffusés lors de l'ajout. De plus, pour éviter les problèmes avec le streaming sur une base par modèle et minimiser l'utilisation de WaitForChild() , vous pouvez personnaliser la façon dont Class.Model|Mod

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

Par défaut/non atomique

Lorsqu'un Model est réglé sur par défaut ou non atomique, le comportement de la diffusion en continu varie en fonction de si 2>ModelStreamingBehavior2> est réglé sur 5>par défaut5> ( 8>héritage8> ) ou 9>amélioré9>.

ModelStreamingBehaviourComportement technique
Par défaut ( Héritage )Le modèle est répliqué lorsqu'un joueur rejoint. Cela peut potentiellement résulter en plus d'instances envoyées pendant le chargement, plus d'instances stockées dans la mémoire et une complexité supplémentaire pour les scripts qui veulent accéder aux descendants du modèlisation. Par exemple, un LocalScript séparé devra utiliser WaitForChild() à
Amélioré Le modèle n'est envoyé que lorsqu'il est nécessaire, ce qui peut potentiellement accélérer les temps d'adhésion.

Voir comportement technique pour plus de détails.

Atomique

Si un Model est modifié en Class.Atomic, tous ses descendants sont diffusés ensemble lorsqu'un descendant BasePart est éligible. Par resultats, un

Un modèle atomique ne se met en mode fusion qu' lorsque toutes ses parties descendant sont éligibles pour la fusion, ce qui donne lieu à la fusion de tout le modèle. Si seulement certaines parties d'un modèle atomique seraient normalement mises en mode fusion, le modèle et ses descendants restent sur le client.

A diagram showing Atomic model streaming along with children.
Script local

-- Le modèle atomique n'existe pas au moment du chargement ; utilisez WaitForChild()
local model = workspace:WaitForChild("Model")
-- Les parties descendantes s'écoulent avec le modèle et sont immédiatement accessibles
local meshPart = model.MeshPart
local part = model.Part

persistant

Les modèles persistants ne sont pas soumis à la normale du streaming dans ou hors. Ils sont envoyés comme une unité atomique complète peu après que le joueur se soit joint et avant que l'événement Class.Workspace.PersistentLoaded ne se lancer.

A diagram showing Persistent model streaming along with children.
Script local

-- Le modèle persistant n'existe pas au moment du chargement ; utilisez WaitForChild()
local model = workspace:WaitForChild("Model")
-- Les parties descendantes s'écoulent avec le modèle et sont immédiatement accessibles
local meshPart = model.MeshPart
local part = model.Part

Joueur persistant

Les modèles définis sur PersistentPerPlayer se comportent de la même façon que Persistent pour les joueurs qui ont été ajoutés en utilisant Model:AddPersistentPlayer(). Pour d'autres joueurs, le comportement est le même que 1> Atomic1>. Vous pouvez rétablir un modèle à partir de la persistance du joueur via 4> Class.Model:RemovePersistentPlayer

Demander une diffuser en direct

Si vous avez configuré le CFrame d'un personnage de joueur dans une région qui n'est pas actuellement chargée, la pause de lecture en continu se produit, si elle est activée. Si vous savez que le personnage se déplacera dans une zone spécifique, vous pouvez appeler Player:RequestStreamAroundAsync() pour demander au serveur d'envoyer des régions autour de cet emplacement au client.

Les scripts suivants montrent comment tirer un événement distant client-serveur pour téléporter un joueur dans un emplacement, ce qui se produit juste avant la demande de streaming avant de déplacer le personnage dans un nouveau CFrame .

Script - Téléportation du personnage du joueur

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Demander un flux de travail autour de l'emplacement de la cible
player:RequestStreamAroundAsync(teleportTarget)
-- Téléportez le personnage
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Appeler la fonction de téléportation lorsque le client lance l'événement distant
teleportEvent.OnServerEvent:Connect(teleportPlayer)
LocalScript - Événement Fire Remote

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local teleportTarget = Vector3.new(50, 2, 120)
-- Activer l'événement distant
teleportEvent:FireServer(teleportTarget)

Détection de la lecture d'instances

Dans certains cas, il est nécessaire de détecter quand un objet s'écoule ou entre et de réagir à cet événement. Un modèle utile pour la détection des flux est le suivant :

  1. En utilisant la section Étiquettes des propriétés d'une instance, ou en utilisant le Éditeur de balises de Studio, attribuez une balise logique à tous les objets affectés.

  2. À partir d'un seul LocalScript, détectez quand un objet marqué s'écoule dans ou par le biais de GetInstanceAddedSignal() et GetInstanceRemovedSignal(), puis traitez l

    LocalScript - Detection de streaming du service de collection

    local CollectionService = game:GetService("CollectionService")
    local tagName = "FlickerLightSource"
    local random = Random.new()
    local flickerSources = {}
    -- Détectez les parties actuellement et nouvellement taguées en direct ou en différé
    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)
    -- Boucle de Flicker
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.wait(0.05)
    end

Personnalisation de l'écran d'arrêt

La propriété Player.GameplayPaused indique l'état de pause actuel du joueur. Cette propriété peut être utilisée avec une connexion GetPropertyChangedSignal() pour afficher ou masquer un interface utilisateur graphiquepersonnalisé.

Script local

local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Désactiver la pause modale par défaut
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Afficher l'interface utilisateur graphiquepersonnalisée
else
-- Masquer l'interface utilisateur graphiquepersonnalisée
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)

Niveau de détail du modèle

Lorsque la lecture en continu est activée, Models en dehors de la zone de lecture en cours ne sera pas visible par défaut. Cependant, vous pouvez instructer le moteur de rendre des maillages de résolution inférieure « impositeurs » pour les modèles qui ne sont pas présents sur les clients via la propriété LevelOfDetail de chaque modèlisation.

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.
Modèle actuel
The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.
Maille « imposteur » de faible résolution
Paramètres de modèleComportement de génération
StreamingMesh Active la génération asynchrone d'un maillage d'imposteur pour afficher lorsque le modèle n'est pas présent sur les clients.
Désactivé / Automatique Le modèle disparaît lorsque le rayon de diffusion est en dehors de la portée de capture.

Lors de l'utilisation de meshes d'imposteur, tenez compte des éléments suivre:

  • Les mailles d'imposteur sont conçues pour être vues à 1024 studs de distance de la caméra ou plus. Si vous avez réduit StreamingTargetRadius à un valeur beaucoup plus petite comme 256, les mailles d'imposteur peuvent ne pas être visuellement acceptables pour le modèle qu'ils remplacent.
  • Si un modèle et ses modèles descendants sont tous configurés pour StreamingMesh , seul le modèle de descendant de niveau supérieur est rendu en tant que maillage imposteur, enveloppant toutes les géométries sous l'ancêtre ainsi que ses modèles descendants. Pour des performances meilleures, il est recommandé d'utiliser désactivé pour les modèles descendants.
  • Les textures ne sont pas prises en charge ; les mailles d'imposteur sont rendues comme des mailles souples.
  • Bien qu'un Model ne soit pas complètement diffusé, le maillage d'imposteur est rendu au lieu de parties individuelles du modèlisation. Une fois que toutes les parties individuelles sont diffusées, ils sont rendus et le maillage d'imposteur ignoré.
  • Les mailles d'imposteur n'ont aucune signification physique et agissent comme inexistantes en matière de lancer de rayons, détection de collision et simulation de physique.
  • L'édition d'un modèle dans Studio, comme l'ajout/l'enlèvement/repositionnement des parties enfantines ou le réinitialisation des couleurs, met automatiquement à jour la maillage de représentation.