Transmisión de instancias

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

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.

The Properties window with the StreamingEnabled property enabled.

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:

Luego, durante el juego, el servidor puede transmitir instancias necesarias al cliente, según sean necesarias.

Diagram showing when various instances and their descendants in the Workspace stream in.
1 El terreno se trata de forma única, en que la instancia se replica al cliente cuando se carga la experiencia, pero las regiones de terreno solo se transmiten cuando sea necesario

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 .

The Properties window with the ModelStreamingBehavior property set to Default.

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.

Diagram showing default model stream in behavior.

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:

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

The Properties window with the ModelStreamingBehavior property set to Improved.

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:

Composición de ensambleComportamiento de streaming
Solo partes sin anclarToda la asamblea se envía como una unidad atómica.
Parte raíz anclada Solo las partes, los accesorios y las restricciones necesarias para enlazar las partes transmitidas a la parte raíz se transmiten juntas.

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.

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

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

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ónComportamiento 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.

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

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

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

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

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

  2. 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ón

    local CollectionService = game:GetService("CollectionService")
    local tagName = "FlickerLightSource"
    local random = Random.new()
    local flickerSources = {}
    -- Detecta actualmente y nuevas partes etiquetadas que se transmiten dentro o fuera
    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)
    -- Bucle de parpadeo
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.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.

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.
Modelo actual
The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.
Malla de "impostor" de baja resolución
Configuración del modeloComportamiento 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.