La transmisión de instancias en experiencia permite que el motor de Roblox cargue y descargue dinámicamente contenido 3D y otras instancias relacionadas en regiones del mundo .Esto puede mejorar la experiencia del jugador en general de varias maneras, por ejemplo:
- Tiempos de unión más rápidos — Los jugadores pueden comenzar a jugar en una parte del mundo mientras más del mundo se carga en el fondo.
- Eficiencia de memoria — Las experiencias se pueden reproducir en dispositivos con menos memoria ya que el contenido se transmite dinámicamente dentro y fuera.Los mundos más inmersivos y detallados se pueden jugar en un mayor rango de dispositivos.
- Mejor rendimiento — Mejor tasa de marcos y ejecución, ya que el servidor puede pasar menos tiempo y ancho de banda sincronizando cambios entre el mundo y los jugadores en él.Los clientes pasan menos tiempo actualizando instancias que no son actualmente relevantes para el jugador.
- Nivel de detalle — Los modelos distantes y el terreno siguen siendo visibles incluso cuando no se transmiten a los clientes, manteniendo la experiencia optimizada sin sacrificar completamente los visuales de fondo.
Habilitar transmisión
La transmisión de instancias está habilitada a través de la propiedad StreamingEnabled del objeto Espacio de trabajo en Studio.Esta propiedad no se puede establecer en un script.La transmisión se habilita por defecto para los nuevos lugares creados en Studio.

Una vez habilitado, se recomienda que adhieras a las siguientes prácticas:
- Debido a que los clientes no tendrán típicamente toda la Workspace disponible localmente, use la herramienta/API adecuada para asegurarse de que existan instancias antes de intentar acceder a ellas en un LocalScript .Por ejemplo, utilice controles de transmisión por modelo , detecte la transmisión de instancias o use WaitForChild() en objetos que pueden no existir
- Minimice la colocación de contenido 3D fuera de Workspace .El contenido en contenedores como ReplicatedStorage o ReplicatedFirst no es elegible para el streaming y puede afectar negativamente el tiempo de unión y el uso de memoria.
- Si mueves el personaje de un jugador al establecer su CFrame, hazlo desde un lado del servidor Script y usa solicitudes de transmisión para cargar más rápidamente los datos alrededor de la nueva ubicación del personaje.
- Establece manualmente el ReplicationFocus del jugador solo en situaciones únicas como en experiencias que no usan un Player.Character .En estos casos, asegúrate de que el enfoque esté cerca del (s) objeto (s) que el jugador controla para garantizar que el contenido siga fluyendo alrededor del punto de interacción del jugador.
Comportamiento técnico
Transmisión en
Por defecto, cuando un jugador se une a una experiencia con transmisión de instancias habilitada, las instancias en el Workspace se replican al cliente, excluyendo lo siguiendo:
- Descendientes de las instancias anteriores
- Instancias no replicadas
Luego, durante el juego, el servidor puede transmitir instancias necesarias al cliente, según sean necesarias.
Comportamiento del modelo
Modelos establecidos a comportamiento no predeterminado como Atómico stream en bajo reglas especiales como se describe en controles de transmisión por modelo.Sin embargo, los modelos predeterminados (no atómicos) se envían de manera diferente según si ModelStreamingBehavior está configurado como Por defecto ( Legado ) o Mejorado .

Cuando ModelStreamingBehavior está configurado como Por defecto / Legado , el contenedor Model y sus descendientes no espaciales como Scripts se replican al cliente cuando el jugador se une.Luego, cuando sea elegible, los descendientes del aplicación de modeladoBasePart fluyen dentro.
Transmisión fuera
Durante el juego, un cliente puede transmitir fuera (quitar de las regiones del jugador Workspace ) y el BaseParts contenido dentro de ellas, según el comportamiento establecido por StreamOutBehavior.El proceso comienza con las regiones más alejadas del personaje del jugador (o ReplicationFocus ) y se mueve más cerca según sea necesario.Las regiones dentro del rango StreamingMinRadius nunca se transmiten.
Cuando una instancia se transmite, se le asigna a nil para que cualquier estado Luau existente se vuelva a conectar si la instancia vuelve a entrar.Como resultado, se eliminan señales de eliminación como ChildRemoved o DescendantRemoving fuego en su padre o ancestro , pero la instancia misma no se destruye en el mismo sentido que una llamada Instance:Destroy() .
Para anticipar aún más el flujo de salida, examine estos escenarios:
Escenario | Ejemplo | Comportamiento de streaming |
---|---|---|
Una parte se creó localmente a través de Instance.new() en un LocalScript . | En un juego de "capturar la Indicador/ marca", creas y adjuntas piezas de casco azul a todos los jugadores del equipo azul a través de un LocalScript . | La parte no se replica al servidor y está exenta de transmitirse a menos que la hagas descendiente de una parte que existe en el servidor, como una parte dentro del aplicación de modeladode personaje de un jugador. |
Una parte se clona localmente desde ReplicatedStorage a través de Instance:Clone() en un LocalScript . | Un personaje mago lanza un hechizo al activar un , sobre el cual se clona un objeto que incluye varios efectos especiales de la posición del mago y se le asigna al espacio de trabajo en la posición del mago. | La parte no se replica al servidor y está exenta de transmitirse a menos que la hagas descendiente de una parte que existe en el servidor. |
Una parte se repara de vuelta de ReplicatedStorage a la zona de trabajo a través de un LocalScript. | Un "sombrero de mago" se almacena en ReplicatedStorage .Cuando un jugador elige jugar en el equipo del mago, el sombrero se mueve a su modelo de personaje a través de un LocalScript . | La parte sigue siendo elegible para transmitirse desde que provino del servidor y se replicó a ReplicatedStorage .Evite este patrón ya que causa una desincronización entre el cliente y el servidor, y la parte puede transmitirse; en cambio, clone la parte. |
Comportamiento del modelo
Si estableces ModelStreamingBehavior a Mejorado , el motor puede transmitir Modelos predeterminados ( No atómicos ) cuando son elegibles para transmitirse, potencialmente liberando memoria en el cliente y reduciendo las instancias que necesitan actualizaciones de propiedad.

Bajo el comportamiento de transmisión mejorado del modelo, la transmisión fuera del modelo predeterminado ( no atómico ) se basa en si el modelo es espacial (contiene descendientes ) o no espacial (no contiene descendientes ).
- Un modelo espacial solo se transmite completamente cuando su último descendiente BasePart salga, ya que algunas de las partes espaciales del aplicación de modeladopueden estar cerca del enfoque del jugador/replicación y otras muy lejos.
- Un modelo no espacial solo se transmite cuando un ancestro se transmite, equivalente al comportamiento de transmisión legado.
Ensambles y mecanismos
Cuando al menos una parte de una ensamblaje es elegible para transmitirse, todas las partes del ensamblaje también se transmiten.Sin embargo, una instalación no transmitirá fuera hasta que todas sus partes sean elegibles para transmitirse.Durante la transmisión, todo el Constraints y Attachments descendente de BaseParts y atómico o persistente Models también se flujo, ayudando a garantizar actualizaciones de física consistentes en los clientes.
Tenga en cuenta que las ensamblajes con piezas ancladas se tratan ligeramente de manera diferente a las ensamblajes con solo piezas sin anclar:
Retraso de tiempo
Puede haber un ligero retraso de ~10 milisegundos entre cuando se crea una parte en el servidor y cuando se replica a los clientes.En cada uno de los siguientes escenarios, es posible que deba utilizar WaitForChild() y otras técnicas en lugar de asumir que los eventos y las actualizaciones de propiedad siempre ocurren al mismo tiempo que la transmisión de partes.
Escenario | Ejemplo | Comportamiento de streaming |
---|---|---|
Un hace una llamada al servidor para crear una parte. | Un jugador activa un Tool localmente para generar una parte en el servidor que todos los jugadores pueden ver y con la que interactuar. | Cuando la función remota regresa al cliente, la parte aún puede no existir, aunque la parte esté cerca del enfoque del cliente y dentro de un área transmitida. |
Se agrega una parte a un modelo de personaje en el servidor a través de un Script y se dispara un RemoteEvent a un cliente. | Cuando un jugador se une al equipo de policía, una parte de "insignia de policía" almacenada en ServerStorage se clona y se adhiere al aplicación de modeladode personaje del jugador.Un RemoteEvent se dispara y recibe por el cliente de ese jugador con el fin de actualizar un elemento de interfaz de usuario local. | Aunque el cliente reciba la señal de evento, no hay garantía de que la parte ya se haya transmitido a ese cliente. |
Una parte colisiona con una región invisible en el servidor y desencadena un RemoteEvent en el cliente. | Un jugador patea una pelota de fútbol dentro de una portería, lo que desencadena un evento de "gol marcado". | Otros jugadores que están cerca del objetivo pueden ver el evento "gol marcado" antes de que se haya transmitido la bola a ellos. |
Propiedades de transmisión
Las siguientes propiedades controlan cómo se aplica el streaming de instancias a tu experiencia.Todas estas propiedades son no scriptables y deben establecerse en el objeto Espacio de trabajo en Studio.

Modelo de transmisión de modelos
Controla si los modelos predeterminados (no atómicos) se replican cuando un jugador se une o solo se envían cuando se necesitan.Si esta propiedad está configurada como Mejorada , los modelos en Workspace solo se enviarán a los clientes cuando sea necesario, potencialmente acelerando los tiempos de unión.Vea Comportamiento técnico para más detalles.
Modo de integridad de streaming
Tu experiencia puede comportarse de formas no intencionadas si un jugador se mueve a una región del mundo que no se ha transmitido a ellos.La característica integridad de transmisión ofrece una manera de evitar esas situaciones potencialmente problemáticas.Por favor, consulte la documentación Enum.StreamingIntegrityMode para más detalles.
Radio de transmisión mínimo
La propiedad StreamingMinRadius indica el radio alrededor del personaje del jugador (o ReplicationFocus ) en el que se transmiten las instancias con la mayor prioridad.Se debe tener cuidado al aumentar el predeterminado, ya que hacerlo requerirá más memoria y más ancho de banda del servidor a expensas de otros componentes.
Radio de destino de streaming
La propiedad StreamingTargetRadius controla la distancia máxima alejada del personaje del jugador (o ReplicationFocus ) en la que se transmiten las instancias.Tenga en cuenta que el motor está permitido retener instancias previamente cargadas más allá del radio objetivo, permitiendo la memoria.
Un menor Radio de destino de transmisión reduce la carga del servidor, ya que el servidor no transmitirá en instancias adicionales más allá del valor establecido.Sin embargo, el radio de destino es también la distancia máxima que los jugadores podrán ver el detalle completo de tu experiencia, por lo que deberías elegir un valor que cree un buen equilibrio entre estos.
Comportamiento de StreamOut
La propiedad StreamOutBehavior establece el comportamiento de transmisión fuera según uno de los siguientes valores:
Configuración | Comportamiento de streaming |
---|---|
Por defecto | Comportamiento predeterminado, actualmente igual que LowMemory . |
Memoria baja | El cliente solo transmite partes en una situación de memoria baja y puede eliminar el contenido 3D hasta que solo esté presente el radio mínimo. |
Oportunista | Las regiones más allá de StreamingTargetRadius se pueden eliminar en el cliente incluso cuando no hay presión de memoria.En este modo, el cliente nunca elimina instancias que estén más cerca que el radio objetivo, excepto en situaciones de baja memoria. |
controlesde transmisión por modelo
A nivel global, la propiedad ModelStreamingBehavior te permite controlar cómo se transmiten los modelos al unirse.Además, para evitar problemas con el streaming en una base por modelo y minimizar el uso de WaitForChild() , puedes personalizar cómo Models y sus descendientes transmiten a través de su propiedad ModelStreamingMode.

Por defecto / no atómico
Cuando un Model está configurado como Por defecto o No atómico , el comportamiento de transmisión varía según si ModelStreamingBehavior está configurado como Por defecto ( Legado ) o Mejorado .
Modelo de transmisión de modelos | Comportamiento técnico |
---|---|
Por defecto ( Legado ) | El modelo se replica cuando un jugador se une.Esto potencialmente resulta en más instancias enviadas durante la carga, más instancias almacenadas en memoria y una mayor complejidad para los scripts que quieren acceder a los descendientes del aplicación de modelado.Por ejemplo, un separado LocalScript necesitará usar WaitForChild() en un descendiente BasePart dentro del aplicación de modelado. |
Mejorado | El modelo solo se envía cuando es necesario, potencialmente acelerando los tiempos de unión. |
Vea comportamiento técnico para más detalles.
Atómico
Si un Model se cambia a Atómico , todos sus descendientes se transmiten juntos cuando un descendiente BasePart es elegible.Como resultado, un separado LocalScript que necesita acceder a instancias en el modelo tendría que usar WaitForChild() en el modelo mismo, pero no en un descendiente MeshPart o Part ya que se envían junto con el aplicación de modelado.
Un modelo atómico solo se transmite cuando todas sus partes descendientes son elegibles para transmitirse, en ese momento todo el modelo se transmite juntamente.Si solo algunas partes de un modelo atómico se transmitirían típicamente, todo el modelo y sus descendientes permanecen en el cliente.
Guión local
local Workspace = game:GetService("Workspace")-- El modelo atómico no existe al momento de la carga; utilice WaitForChild()local model = Workspace:WaitForChild("Model")-- Las partes descendientes fluyen con el modelo y son inmediatamente accesibleslocal meshPart = model.MeshPartlocal part = model.Part
Persistente
Los modelos persistentes no están sujetos a la transmisión normal dentro o fuera.Se envían como una unidad atómica completa poco después de que el jugador se una y antes de que se active el evento Workspace.PersistentLoaded.Los modelos persistentes y sus descendientes nunca se transmiten, pero para manejar con seguridad la transmisión dentro de un modelo separado LocalScript, debe usar WaitForChild() en el modelo padre, o esperar a que se desencadenarel evento PersistentLoaded.
Guión local
local Workspace = game:GetService("Workspace")-- El modelo persistente no existe al momento de la carga; utilice WaitForChild()local model = Workspace:WaitForChild("Model")-- Las partes descendientes fluyen con el modelo y son inmediatamente accesibleslocal meshPart = model.MeshPartlocal part = model.Part
Persistente por jugador
Los modelos establecidos a PersistentPerPlayer se comportan igual que Persistente para los jugadores que se han agregado usando Model:AddPersistentPlayer().Para otros jugadores, el comportamiento es el mismo que Atómico.Puedes revertir un modelo desde la persistencia del jugador a través de Model:RemovePersistentPlayer() .
Solicitar transmisión de área
Si configuras el CFrame de un personaje de jugador a una región que no está cargada actualmente, pausa de transmisión ocurre, si está habilitado.Si sabe que el personaje se moverá a una zona específica, puede llamar Player:RequestStreamAroundAsync() para solicitar que el servidor envíe regiones alrededor de esa ubicación al cliente.
Los siguientes scripts muestran cómo disparar un evento remoto cliente-servidor para teletransportar a un jugador dentro de un lugar antes de mover el personaje a un nuevo CFrame.
Script - Teletransportar el personaje del jugador
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Solicitar transmisión alrededor de la ubicación objetivo
player:RequestStreamAroundAsync(teleportTarget)
-- Personaje de teletransporte
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Llamar la función de teletransporte cuando el cliente dispara el evento remoto
teleportEvent.OnServerEvent:Connect(teleportPlayer)
LocalScript - Evento de fuego remoto
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Disparar el evento remototeleportEvent:FireServer(teleportTarget)
Detectar transmisión de instancias
En algunos casos, es necesario detectar cuando un objeto fluye hacia adentro o hacia afuera y reaccionar a ese evento.Un patrón útil para la detección de streaming es el siguiente:
Al usar la sección Etiquetas de las propiedades de una instancia o el Editor de etiquetas de Studio, asigne una etiqueta lógica a todos los objetos afectados.
Desde un solo LocalScript , detecta cuando un objeto etiquetado fluye dentro o fuera a través de GetInstanceAddedSignal() y GetInstanceRemovedSignal() , luego maneja el objeto de acuerdo.Por ejemplo, el siguiente código agrega objetos etiquetados Light en un ciclo "flicker" cuando se transmiten y los elimina cuando se transmiten.
LocalScript - Servicio de detección de transmisión de Colecciónlocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- Detecta actualmente y nuevas partes etiquetadas que se transmiten dentro o fuerafor _, 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)-- Bucle de parpadeowhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
Personalizar la pantalla de pausa
La propiedad Player.GameplayPaused indica el estado de pausa actual del jugador.Esta propiedad se puede usar con una conexión GetPropertyChangedSignal() para mostrar o ocultar una Interfaz gráfica (o GUI)personalizada.
Guión local
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Desactivar modal de pausa predeterminada
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Mostrar Interfaz gráfica (o GUI)personalizada
else
-- Ocultar Interfaz gráfica (o GUI)personalizado
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Nivel de detalle del modelo
Cuando el streaming está habilitado, Models fuera del área actualmente transmitida no será visible por defecto.Sin embargo, puedes instruir al motor para que renderice mallas de resolución más baja de "impostores" para modelos que no están presentes en los clientes a través de la propiedad LevelOfDetail de cada aplicación de modelado.



Configuración del modelo | Comportamiento de streaming |
---|---|
streaming de malla | Activa la generación asíncrona de una malla de impostor para mostrar cuando el modelo no está presente en los clientes. |
Deshabilitado / Automático | El modelo desaparece cuando está fuera del radio de transmisión. |
Al usar mallas de impostor, tenga en cuenta lo siguiendo:
- Las mallas de impostor están diseñadas para verse a 1024 metros de distancia de la cámara o más.Si has reducido StreamingTargetRadius a un valor mucho más pequeño como 256, las mallas impostoras pueden no ser visualmente aceptables para el modelo que reemplazan.
- Si un modelo y sus modelos descendientes están todos configurados para StreamingMesh , solo se renderiza el modelo ancestro superior como un mallaimpostor que envuelve todas las geometrías bajo el ancestro, así como sus modelos descendientes.Para un mejor ejecución, se recomienda que uses Deshabilitado para modelos descendientes.
- No se admiten texturas; las mallas de impostores se renderizan como mallas suaves.
- Mientras que un Model no se transmite completamente, la malla del impostor se renderiza en lugar de las partes individuales del aplicación de modelado.Una vez que todas las partes individuales se transmitan, se renderizarán y se ignorará la malla del impostor.
- Las mallas de impostor no tienen significado físico y actúan como no existentes con respecto a raycasting, detección de colisiones y simulación de física.
- Editar un modelo en Studio, como agregar/eliminar/reubicar piezas hijas o restablecer colores, actualiza automáticamente la malla representativa.