O streaming de instância na experiência permite que o Roblox Engine carregue e descarregue dinamicamente conteúdo 3D e instâncias relacionadas em regiões do mundo .Isso pode melhorar a experiência geral do jogador de várias maneiras, por exemplo:
- Tempos de entrada mais rápidos — Jogadores podem começar a jogar em uma parte do mundo enquanto mais do mundo carrega em segundo plano.
- Eficiência de memória — Experiências podem ser jogadas em dispositivos com menos memória, pois o conteúdo é dinamicamente transmitido e recebido.Mundos mais imersivos e detalhados podem ser jogados em um maior número de dispositivos.
- Melhor desempenho — Melhor taxa de quadros e performance, pois o servidor pode gastar menos tempo e largura de banda sincronizando alterações entre o mundo e os jogadores nele.Os clientes gastam menos tempo atualizando instâncias que não são atualmente relevantes para o jogador.
- Nível de detalhe — Modelos distantes e terreno permanecem visíveis mesmo quando não são transmitidos para os clientes, mantendo a experiência otimizada sem sacrificar totalmente os visuais de fundo.
Ativar streaming
A transmissão de instâncias é habilitada através da propriedade StreamingEnabled do objeto Workspace no Studio.Essa propriedade não pode ser definida em um script.A transmissão é habilitada por padrão para novos locais criados no Studio.

Uma vez ativado, é recomendado que você adira às seguintes práticas:
- Porque os clientes normalmente não terão toda a Workspace disponível localmente, use a ferramenta/API apropriada para garantir que as instâncias existam antes de tentar acessá-las em um LocalScript .Por exemplo, utilize controles de streaming por modelo , detectar streaming de instâncias ou use WaitForChild() em objetos que podem não existir.
- Minimize a colocação de conteúdo 3D fora de Workspace .Conteúdo em contêineres como ReplicatedStorage ou ReplicatedFirst não é elegível para streaming e pode afetar negativamente o tempo de junção e o uso de memória.
- Se você mover o personagem de um jogador definindo seu CFrame, faça isso de um lado do servidor Script e use solicitações de streaming para carregar mais rapidamente dados ao redor da nova localização do personagem.
- Defina manualmente o ReplicationFocus do jogador apenas em situações únicas, como em experiências que não usam um Player.Character.Nesses casos, certifique-se de que o foco está perto do(s) Objeto(s) que o jogador controla para garantir que o conteúdo continue a fluir em torno do ponto de interação do jogador.
Comportamento técnico
Stream em
Por padrão, quando um jogador se junta a uma experiência com streaming de instância ativado, instâncias no Workspace são replicadas para o cliente, excluindo o seguindo:
- Descendentes das instâncias acima descritas
- Instâncias não replicantes
Então, durante o jogabilidade, o servidor pode transmitir instâncias necessárias para o cliente, conforme forem necessárias.
Comportamento do modelo
Modelos definidos para comportamento não padrão como Atômico stream em sob regras especiais como descrito em Controles de streaming por modelo.No entanto, modelos padrão (não atômicos) são enviados de forma diferente dependendo de se ModelStreamingBehavior está definido como Padrão ( Legado ) ou Melhorado .

Quando ModelStreamingBehavior é definido como Padrão / Legado , o contêiner Model e seus descendentes não espaciais, como Scripts, se repetem ao cliente quando o jogador se junta.Então, quando elegível, os descendentes do modelo BasePart entram.
Transmissão fora
Durante o jogabilidade, um cliente pode transmitir para fora (remover das regiões do jogador Workspace ) e o BaseParts contido nelas, com base no comportamento definido por StreamOutBehavior.O processo começa com regiões mais distantes do personagem do jogador (ou ReplicationFocus ) e se move mais perto conforme necessário.Regiões dentro do StreamingMinRadius alcance nunca são transmitidas.
Quando uma instância é transmitida, ela é parentada para nil para que qualquer estado Luau existente se conecte novamente se a instância voltar a entrar.Como resultado, sinais de remoção, como ChildRemoved ou DescendantRemoving fogo em seu pai ou ancestral , mas a própria instância não é destruída no mesmo sentido de uma chamada Instance:Destroy().
Para antecipar ainda mais o lançamento, examine esses cenários:
Cenário | Exemplo | Comportamento de streaming |
---|---|---|
Uma peça é criada localmente através de Instance.new() em um LocalScript . | Em um jogo de "carregar a marcador / bandeira", você cria e anexa peças de capacete azul a todos os jogadores na equipe azul através de um LocalScript . | A peça não é replicada para o servidor e está isenta de streaming fora de a menos que você a torne um descendente de uma peça que existe no servidor, como uma peça dentro do modelo de personagem de um jogador. |
Uma peça é clonada localmente de ReplicatedStorage através de Instance:Clone() em um LocalScript . | Um personagem feiticeiro lança um feitiço ativando um Tool, sobre o qual um objeto que inclui vários efeitos especiais é clonado do ReplicatedStorage e parentado para o espaço de trabalho na posição do feiticeiro. | A peça não é replicada para o servidor e está isenta de streaming fora de a menos que você a torne um descendente de uma peça que existe no servidor. |
Uma peça é reparada de ReplicatedStorage para o espaço de trabalho através de um LocalScript . | Um "chapéu de mago" é armazenado em ReplicatedStorage .Quando um jogador escolhe jogar na Equipedo mago, o chapéu é movido para o modelo de personagem deles através de um LocalScript . | A parte permanece elegível para streaming desde que veio do servidor e foi replicada para ReplicatedStorage .Evite esse padrão, pois causa um desincronização entre o cliente e o servidor, e a parte pode ser transmitida; em vez disso, clone a parte. |
Comportamento do modelo
Se você definir ModelStreamingBehavior para Melhorado , o motor pode transmitir Modelos Padrão ( Não Atômico ) quando eles forem elegíveis para transmissão, potencialmente liberando memória no cliente e reduzindo as instâncias que precisam de atualizações de propriedade.

Abaixo de melhorado comportamento de streaming de modelo, streaming fora de padrão ( não atômico ) modelos é baseado se o modelo é espacial (contém descendentes) ou não espacial (não contém descendentes ).
- Um modelo espacial só flui completamente quando seu último descendente restante BasePart flui, pois algumas das partes espaciais do modelo podem estar perto do foco do jogador/replicação e algumas longe.
- Um modelo não espacial só é transmitido quando um ancestral é transmitido, equivalente ao comportamento de streaming legado.
Montagens e mecanismos
Quando pelo menos uma parte de uma assemblagem é elegível para streaming, todas as partes da montagem também são transmitidas.No entanto, uma montagem não vai transmitir fora até que todas de suas partes sejam elegíveis para transmissão.Durante a transmissão, todos os Constraints e Attachments descendo de BaseParts e átomico ou persistente Models também são transmitidos, ajudando a garantir atualizações consistentes de física nos clientes.
Observe que assemblagens com peças ancoradas são tratadas ligeiramente de forma diferente das assemblagens com apenas peças não ancoradas:
Composição de montagem | Comportamento de streaming |
---|---|
Apenas peças não ancoradas | Toda a montagem é enviada como uma unidade atômica. |
Ancorada parte raiz ancorada | Apenas as peças, anexos e restrições necessárias para ligar as peças transmitidas à peça raiz são transmitidas juntas. |
Atraso de tempo
Pode haver um pequeno atraso de ~10 milisegundos entre quando uma parte é criada no servidor e quando é replicada para os clientes.Em cada um dos seguintes cenários, você pode precisar usar WaitForChild() e outras técnicas em vez de assumir que eventos e atualizações de propriedade sempre ocorrem ao mesmo tempo que a transmissão em parte.
Cenário | Exemplo | Comportamento de streaming |
---|---|---|
Um LocalScript faz um chamada RemoteFunction ao servidor para criar uma peça. | Um jogador ativa um Tool localmente para gerar uma peça no servidor que todos os jogadores podem ver e interagir. | Quando a função remota retorna ao cliente, a peça pode não existir ainda, mesmo que a peça esteja perto do foco do cliente e dentro de uma área transmitida. |
Uma parte é adicionada a um modelo de personagem no servidor através de um Script e um RemoteEvent é disparado para um cliente. | Quando um jogador se junta à Equipede polícia, uma parte de "insígnia de polícia" armazenada em ServerStorage é clonada e anexada ao modelo de personagem do jogador.Um RemoteEvent é disparado e recebido pelo cliente desse jogador para atualizar um elemento de UI local. | Embora o cliente receba o sinal de evento, não há garantia de que a parte já tenha sido transmitida para esse cliente. |
Uma peça colide com uma região invisível no servidor e gera um RemoteEvent no cliente. | Um jogador chuta uma bola de futebol para uma meta, acionando um evento "gol marcado". | Outros jogadores que estão perto do gol podem ver o evento "gol marcado" antes de a bola ter sido transmitida para eles. |
Propriedades de streaming
As propriedades a seguir controlam como a transmissão de instâncias se aplica à sua experiência.Todas essas propriedades são não scriptáveis e devem ser definidas no objeto Área de Trabalho no Studio.

Comportamento de Streaming de Modelo
Controla se Padrão ( Não atômico ) modelos são replicados quando um jogador se junta ou são enviados apenas quando necessário.Se esta propriedade for definida como Melhorada , modelos em Workspace serão enviados aos clientes somente quando necessário, potencialmente acelerando os tempos de join.Veja Comportamento Técnico para mais detalhes.
Modo de Integridade de Streaming
Sua experiência pode se comportar de maneiras não intencionais se um jogador se mover para uma região do mundo que não foi transmitida para eles.A funcionalidade de integridade de streaming oferece uma maneira de evitar essas situações potencialmente problemáticas.Por favor, consulte a documentação Enum.StreamingIntegrityMode para mais detalhes.
StreamingMinRadius
A propriedade StreamingMinRadius indica o raio ao redor do personagem do jogador (ou ) em que as instâncias são transmitidas com a maior prioridade.Deve-se ter cuidado ao aumentar o padrão, pois isso exigirá mais memória e mais largura de banda do servidor em detrimento de outros componentes.
Alcance de StreamingTargetRadius
A propriedade StreamingTargetRadius controla a distância máxima de distância do personagem do jogador (ou ) em que as instâncias são transmitidas.Observe que o motor é permitido manter instâncias previamente carregadas além do raio alvo, permitindo a memória.
Um menor Alcance de StreamingTarget reduz a carga do servidor, pois o servidor não transmitirá em instâncias adicionais além do valor definido.No entanto, o raio-alvo também é a distância máxima que os jogadores poderão ver todos os detalhes de sua experiência, então você deve escolher um valor que crie um bom equilíbrio entre esses.
Comportamento de StreamOut
A propriedade StreamOutBehavior define o comportamento de transmissão fora de acordo com um dos seguintes valores:
Configuração | Comportamento de streaming |
---|---|
Padrão | Comportamento padrão, atualmente o mesmo que Memória Baixa . |
Memória Baixa | O cliente apenas transmite peças em uma situação de baixa memória e pode remover conteúdo 3D até que apenas o raio mínimo esteja presente. |
Oportunístico | Regiões além de StreamingTargetRadius podem ser removidas no cliente mesmo quando não há pressão de memória.Neste modo, o cliente nunca remove instâncias que estão mais próximas do que o raio alvo, exceto em situações de baixa memória. |
controlesde streaming por modelo
Globalmente, a propriedade ModelStreamingBehavior permite que você controle como os modelos são transmitidos ao entrar.Além disso, para evitar problemas com streaming em uma base por modelo e minimizar o uso de WaitForChild() , você pode personalizar como Models e seus descendentes transmitem através de sua propriedade ModelStreamingMode.

Padrão / não atômico
Quando um Model é definido como Padrão ou Não atômico , o comportamento de streaming varia dependendo de se ModelStreamingBehavior está definido como Padrão ( Legado ) ou Melhorado .
Comportamento de Streaming de Modelo | Comportamento técnico |
---|---|
Padrão ( Legado ) | O modelo é replicado quando um jogador se junta.Isso pode resultar em mais instâncias enviadas durante o carregamento, mais instâncias armazenadas na memória e complexidade adicional para scripts que querem acessar os descendentes do modelo.Por exemplo, um separado LocalScript precisará usar WaitForChild() em um descendente BasePart dentro do modelo. |
Melhorado | O modelo é enviado apenas quando necessário, potencialmente acelerando os tempos de join. |
Veja comportamento técnico para mais detalhes.
Atômico
Se um Model for alterado para Atômico , todos os seus descendentes são transmitidos juntos quando um descrente BasePart for elegível.Como resultado, um separado LocalScript que precisa acessar instâncias no modelo precisaria usar WaitForChild() no próprio modelo, mas não em um descendente MeshPart ou Part uma vez que eles são enviados ao lado do modelo.
Um modelo atômico é transmitido apenas quando todas as suas partes descendentes são elegíveis para streaming, na qual o modelo inteiro é transmitido juntamente.Se apenas algumas partes de um modelo atômico geralmente forem transmitidas, todo o modelo e seus descendentes permanecem no cliente.
LocalScript
local Workspace = game:GetService("Workspace")-- O modelo atômico não existe no momento de carregamento; use WaitForChild()local model = Workspace:WaitForChild("Model")-- Peças descendentes são transmitidas com o modelo e são imediatamente acessíveislocal meshPart = model.MeshPartlocal part = model.Part
Peristente
Modelos persistentes não estão sujeitos ao streaming normal em ou fora.Eles são enviados como uma unidade atômica completa logo após o jogador se juntar e antes do evento Workspace.PersistentLoaded disparar.Modelos persistentes e seus descendentes nunca são transmitidos, mas para lidar com a transmissão com segurança dentro de um modelo separado LocalScript, você deve usar WaitForChild() no modelo pai ou esperar que o evento PersistentLoaded Iniciar / executar.
LocalScript
local Workspace = game:GetService("Workspace")-- Modelo persistente não existe no momento do carregamento; use WaitForChild()local model = Workspace:WaitForChild("Model")-- Peças descendentes são transmitidas com o modelo e são imediatamente acessíveislocal meshPart = model.MeshPartlocal part = model.Part
PersistentePerPlayer
Modelos definidos para PersistentePerPlayer se comportam da mesma maneira que Persistente para jogadores que foram adicionados usando Model:AddPersistentPlayer().Para outros jogadores, o comportamento é o mesmo que Atômico.Você pode reverter um modelo da persistência do jogador via Model:RemovePersistentPlayer() .
Solicitar transmissão de área
Se você definir o CFrame de um personagem de jogador para uma região que não está carregada atualmente, pausa de streaming ocorre, se habilitado.Se você sabe que o personagem vai se mover para uma área específica, você pode chamar Player:RequestStreamAroundAsync() para solicitar que o servidor envie regiões ao redor dessa localização para o cliente.
Os seguintes scripts mostram como disparar um evento remoto cliente-servidor para teletransportar um jogador dentro de um local, produzindo na solicitação de streaming antes de mover o personagem para um novo CFrame.
Script - Teletransportar Personagem do Jogador
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Solicitar streaming ao redor da localização alvo
player:RequestStreamAroundAsync(teleportTarget)
-- Personagem de teletransporte
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Chame a função de teletransporte quando o cliente disparar o evento remoto
teleportEvent.OnServerEvent:Connect(teleportPlayer)
LocalScript - Evento de Fogo Remoto
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Dispare o evento remototeleportEvent:FireServer(teleportTarget)
Detectar streaming de instância
Em alguns casos, é necessário detectar quando um objeto entra ou sai e reagir a esse evento.Um padrão útil para detecção de streaming é o seguinte:
Usando a seção tags das propriedades de uma instância ou o Editor de tags do Studio, atribua uma tag lógica CollectionService a todos os objetos afetados
A partir de um único LocalScript , detecte quando um objeto rotulado flui para dentro ou para fora através de GetInstanceAddedSignal() e GetInstanceRemovedSignal() , então lidar com o objeto de acordo.Por exemplo, o seguinte código adiciona objetos marcados Light em um ciclo "flicker" quando eles são transmitidos e os remove quando são transmitidos.
LocalScript - Detecção de Streaming de Serviço de Coleçãolocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- Detectar atualmente e novas peças marcadas transmitindo para dentro ou para forafor _, 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)-- Ciclo de brilhowhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
Personalize a tela de pausa
A propriedade Player.GameplayPaused indica o estado de pausa atual do jogador.Essa propriedade pode ser usada com uma conexão GetPropertyChangedSignal() para mostrar ou ocultar uma Interface gráfica do usuáriopersonalizada.
LocalScript
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Desabilitar modal de pausa padrão
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Mostrar Interface gráfica do usuáriopersonalizada
else
-- Ocultar Interface gráfica do usuáriopersonalizada
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Nível de detalhe do modelo
Quando o streaming estiver ativado, Models fora da área atualmente transmitida não será visível por padrão.No entanto, você pode instruir o motor a renderizar malhas de resolução mais baixa "impostor" para modelos que não estão presentes nos clientes através da propriedade LevelOfDetail do modelo de cada modelo.



Configuração do modelo | Comportamento de streaming |
---|---|
StreamingMesh | Ativa a geração assíncrona de um mesh de impostor para exibir quando o modelo não está presente nos clientes. |
Desativado / Automático | O modelo desaparece quando fora do raio de streaming. |
Ao usar malhas de impostor, note o seguindo:
- As malhas de impostor são projetadas para serem vistas a 1024 metros de distância da câmera ou mais.Se você reduziu StreamingTargetRadius para um valor muito menor, como 256, malhas de impostores podem não ser visualmente aceitáveis para o modelo que eles substituem.
- Se um modelo e seus modelos descendentes estiverem todos definidos para StreamingMesh , apenas o modelo ancestral de alto nível é renderizado como uma malha impostora, que envolve todas as geometrias sob o ancestor, assim como seus modelos descendentes.Para melhor performance, é recomendado que você use Desativado para modelos descendentes.
- Texturas não são suportadas; malhas de impostores são renderizadas como malhas suaves.
- Enquanto um Model não é totalmente transmitido, a malha do impostor é renderizada em vez de partes individuais do modelo.Uma vez que todas as peças individuais forem transmitidas, elas renderizam e o impostor mesh é ignorado.
- As malhas de impostores não têm significado físico e agem como inexistentes em relação a raycasting, detecção de colisão e simulação de física.
- Editar um modelo no Studio, como adicionar/excluir/reposicionar peças filhas ou redefinir cores, atualiza automaticamente a malha representativa.