In-experience stream de instância de código 3D permite que o motor Roblox 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 em vários modos, por exemplo:
- Tempos de entrada mais rápidos — Os jogadores podem começar a jogar em uma parte do mundo enquanto mais do mundo carrega no fundo.
- Eficiência da memória — Experiências podem ser jogadas em dispositivos com menos memória, já que o conteúdo é dinamicamente transmitido e recebido. Mundos mais imersivos e detalhados podem ser jogados em um maior alcance de dispositivos.
- Desempenho melhorado — Melhores taxas de quadro e performance, como o servidor pode gastar menos tempo e largura de banda sincronizando as alterações entre o mundo e os jogadores nela. 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 eles não são transmitidos para os clientes, mantendo a experiência otimizada sem sacrificar totalmente os visuais de fundo.
Habilitando Streaming
O streaming de instância é habilitado através da propriedade StreamingEnabled do objeto Espaço de Trabalho no Studio. Essa propriedade não pode ser definida em um script. O streaming é habilitado por padrão para novos locais criados no Studio.
Uma vez ativado, recomenda-se que você adere às seguintes práticas:
- Porque os clientes normalmente não terão o Workspace completo disponível localmente, use a ferramenta/API apropriada para garantir que instâncias existam antes de tentar acessá-las em um LocalScript . Por exemplo, utilize controles de streaming por modelo, 1> detecte controles de streaming1> ou use
- Minimize o posicionamento 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 entrada e o uso de memória.
- Se você mover o personagem de um jogador ao definir seu CFrame, faça isso a partir de um lado do servidor Script e use solicitações de streaming para carregar mais rápido os dados ao redor da nova localização do personagem.
- Configurado manualmente o ReplicationFocus do jogador apenas em situações únicas, como em experiências que não usam um Player.Character . Nestes casos, certifique-se de que o foco está perto dos Objeto(s) que o jogador controla para garantir que o conteúdo continue a ser transmitido ao redor do ponto de interação do jogador.
Comportamento Técnico
Streaming em
Por padrão, quando um jogador se juntar 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
- Não replicando instâncias
Então, durante o jogabilidade, o servidor pode encaminhar instâncias necessárias ao cliente, conforme necessário.
Comportamento do Modelo
Modelos definidos para comportamento não padrão, como Stream de Atômica em Controles de Per-Model Streaming sob regras especiais. No entanto, modelos padrão (não atômicos) são enviados de forma diferente com base em se ModelStreamingBehavior é definido como 1> Padrão1> (4> Legado4> ou 7> Melhorado</
Quando ModelStreamingBehavior está definido como Padrão / Legado , o contêiner 1> Class.Model1> e seus descendentes não-espaaciais, como 4> Class.Script|Scripts4>, são replicados para o cliente quando o jogador se juntar. Então, quando elegível, os desc
Exibição
Durante o jogabilidade, um cliente pode stream out (remover da área do jogador) regiões e as Workspace contidas dentro deles, com base no comportamento definido por BaseParts. O processo começa com regiões mais distantes do personagem (ou Class.Player.ReplicationFocus
Quando uma instância é selecionada, ela é vinculada à nil para que qualquer estado Luau existente seja reconectado se a instância for selecionada de volta. Como resultado, sinais de remoção, como Class.Instance.ChildRem
Para antecipar a saída, examine estes cenários:
Cenário | Exemplo | Comportamento de streaming |
---|---|---|
Uma parte é criada localmente através de Instance.new() em um LocalScript . | Em um jogo de " capture the marcador / bandeira", você cria e aplica 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 transmissão a menos que você a faça uma 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 1> Class.LocalScript1> . | Um personagem de mago liga um feitiço ao ativar um Tool, no qual um objeto incluindo vários efetos especiais é clonado de ReplicatedStorage e ligado ao espaço de trabalho na posição do mago. | A peça não é replicada para o servidor e está isenta de transmissão a menos que você a faça uma descendente de uma peça que existe no servidor. |
Uma peça está reaparecida de Class.ReplicatedStorage para o espaço de trabalho via um ReplicatedStorage. | 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 via um LocalScript. | A peça permanece elegível para streaming, pois ela veio do servidor e foi replicada para ReplicatedStorage. Evite esse padrão, pois causa uma desincronização entre o cliente e o servidor e a peça pode ser streamed; em vez disso, Clone a peça. |
Comportamento do Modelo
Se você definir ModelStreamingBehavior para Melhorado , o motor pode streamer padrão ( 1> não atômico1> ) modelos quando eles são elegíveis para streamer, potencialmente liberando memória no cliente e reduzindo as instâncias que precisam de atualizações de propriedade.
Sob o comportamento de streaming de modelos Melhorado, streaming de fora de modelos Padrão (não-átomos), baseado no comportamento de saída de modelos 2>Espaçais2> (contém descendentes de 5> Class.BasePart5>).
- Um modelo espacial apenas é capturado completamente quando sua última parte descendente BasePart é capturada, já que algumas das peças espaciais do modelo podem estar perto do foco do jogador/replicação e algumas estão distantes.
- Um modelo não espaçal só é gerado quando um ancestral é gerado, o que é equivalente ao comportamento de streaming de saída de legado.
Encontros e Mecanismos
Quando pelo menos uma parte de uma montagem é elegível para streaming em, todas as partes da montagem também são streamed. No entanto, uma montagem não stream fora até que todas
Nota que montagens com partes ancoradas são tratadas um pouco de forma diferente do que montagens com apenas peças não ancoradas:
Composição da Área | Comportamento de streaming |
---|---|
Apenas peças não ancoradas | Toda a montagem é enviada como uma unidade atômica. |
Anchored parte de raiz | Apenas as peças, acessórios e restrições necessárias para conectar as peças transmitidas à peça raiz são transmitidas juntas. |
Atraso de Temporização
Pode haver um pequeno atraso de ~10 milissegundos entre quando uma parte é criada no servidor e quando ela é 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 os eventos e atualizações de propriedade sempre ocorrem no mesmo momento que a partida está transmitindo.
Cenário | Exemplo | Comportamento de streaming |
---|---|---|
Um LocalScript faz uma chamada de RemoteFunction ao servidor para criar uma parte. | 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 ainda não existir, mesmo que a peça esteja perto do foco do cliente e dentro de uma área de streaming. |
Uma parte é adicionada a um modelo de personagem no servidor via um Script e um RemoteEvent é executado para um cliente. | Quando um jogador se juntar à Equipede polícia, uma parte de "emblema de polícia" armazenada em ServerStorage é clonada e anexada ao modelo de personagem do jogador. Um RemoteEvent é executado e recebido pelo cliente do jogador para atualizar um elemento de UI local. | Embora o cliente receba o sinal de evento, não há garantia de que a peça já tenha sido transmitida para aquele 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 um gol, gerando um evento "gol marcado". | Jogadores próximos do gol podem ver o evento "gol marcado" antes que a bola seja transmitida para eles. |
Propriedades de streaming
As propriedades a seguir controlam como o streaming de instância se aplica à sua experiência. Todas essas propriedades são não scriptáveis e devem ser definidas no objeto Espaço de Trabalho no Studio.
Comportamento de Modelagem
Controla se os modelos Padrão (Não atômico ) são replicados quando um jogador se juntar ou são apenas enviados quando necessário. Se esta propriedade estiver definida como Melhorada , os modelos em 1> Class.Workspace1> serão apenas enviados para os clientes quando necessário, potencialmente acelerando os tempos de entrada. Veja 4>Com
Modo de Integridade de Streaming
Sua experiência pode comportar de maneiras não intencionais se um jogador se mover para uma região do mundo que não foi streamed para eles. A função streaming integrity oferece uma maneira de evitar essas situações potencialmente problemáticas. Por favor, consulte a Enum.StreamingIntegrityMode documentação para mais detalhes.
Raio de Minimáximo
A propriedade StreamingMinRadius indica o raio ao redor do personagem do jogador (ou ReplicationFocus ) em que instâncias stream em alta prioridade. Cuidado deve ser tomado ao aumentar o padrão, pois isso exigirá mais memória e mais largura de banda do servidor, a expensas de outros componentes.
Raio de streaming
A propriedade StreamingTargetRadius controla a distância máxima de dist離 do personagem do jogador (ou ReplicationFocus ) em que instâncias stream em. Observe que o motor é permitido manter instâncias previamente carregadas além do raio de dist離, permitindo memória.
Um menor StreamingTargetRadius reduz o trabalho do servidor, pois o servidor não vai stream em instâncias adicionais além do valor definido. No entanto, o raio de alvo é também a distância máxima que os jogadores poderão ver o detalhe completo 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 streaming out de acordo com um dos seguintes valores:
Configurando | Comportamento de streaming |
---|---|
Padrão | Comportamento padrão, atualmente o mesmo que LowMemory . |
BaixaMemória | O cliente só transfere peças em uma situação de baixa memória e pode remover conteúdo 3D até que o raio mínimo esteja presente. |
Oportunista | 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 perto do raio de aplicação, exceto em situações de baixa memória. |
Controles de Streaming Por Modelo
Globalmente, a propriedade ModelStreamingBehavior permite que você controle como os modelos são streamed em on-join. Além disso, para evitar problemas com a streamiz
Padrão/Não-Atômico
Quando um Model está definido como Padrão ou Não-Atômico, o comportamento de streaming varia com base em se o 2>ModelStreamingBehavior2> está definido como 5>Padrão5> ( 8>Legado8> ) ou 9>Melhorado9>.
ModelStreaming comportamento | Comportamento Técnico |
---|---|
Padrão ( Legado ) | O modelo é replicado quando um jogador se juntar. Isso pode potencialmente 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 LocalScript separado precisará usar WaitForChild() dentro de um descend |
Melhorado | O modelo só é enviado quando necessário, potencialmente atrasando os tempos de entrada. |
Veja Comportamento Técnico para mais detalhes.
Atômico
Se um Model for alterado para Class.Atomic, todos os seus descendentes são streamed juntos quando um descendente BasePart é elegível. Como resultado, um <
Um modelo atômico só é gerado quando todas as suas partes descendentes são elegíveis para streaming, na qual ponto o modelo inteiro é streaming juntos. Se apenas algumas partes de um modelo atômico geralmente seriam streaming, o modelo e seus descendentes permanecem no cliente.
Script Local
-- Modelo atômico não existe no tempo de carregamento; use WaitForChild()local model = workspace:WaitForChild("Model")-- As peças descendentes entram com o modelo e são imediatamente acessíveislocal meshPart = model.MeshPartlocal part = model.Part
Persistente
Modelos persistentes não são sujeitos a streaming normal em ou fora. Eles são enviados como uma unidade atômica completa logo após o jogador se juntar e antes que o evento Class.Workspace.PersistentLoaded Iniciar / executar. Modelos persistentes e
Script Local
-- Modelo persistente não existe no momento de carregamento; use WaitForChild()local model = workspace:WaitForChild("Model")-- As peças descendentes entram com o modelo e são imediatamente acessíveislocal meshPart = model.MeshPartlocal part = model.Part
Jogador Persistente
Modelos definidos para PersistentPerPlayer comportam-se da mesma forma que Persistent para os jogadores que foram adicionados usando Model:AddPersistentPlayer(). Para outros jogadores, o comportamento é o mesmo que 1> Atomic1> . Você pode reverter um modelo de persistência de jogador via 4> Class.Model:RemovePersistentPlayer()4>.
Solicitando Área de Streaming
Se você definir o CFrame de um personagem de um personagem a uma região que não está atualmente carregada, streaming pause ocorre, se habilitado. Se você souber que o personagem está se movendo 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 de cliente para o servidor para teletransportar um jogador dentro de um local, gerando na solicitação de streaming antes de mover o personagem para um novo Datatype.CFrame.
Script - Teleportar Personagem do Jogador
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Solicitar streaming em torno da localização do alvo
player:RequestStreamAroundAsync(teleportTarget)
-- Teleportar personagem
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 teleporte quando o cliente executar o evento remoto
teleportEvent.OnServerEvent:Connect(teleportPlayer)
LocalScript - Evento Remoto de Fogo
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Fire o evento remototeleportEvent:FireServer(teleportTarget)
Detectando Instância de Streaming
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 é a seguinte:
Usando a seção Tags de propriedades de uma instância ou o Editor de Tags do Studio, atribua uma etiqueta lógica de CollectionService a todos os objetos afetados.
De um único LocalScript , detecte quando um objeto marcado flui em ou fora através de GetInstanceAddedSignal() e GetInstanceRemovedSignal(), então lidar com o objeto de acordo
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 com ou sem tagfor _, 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)-- Loop de cortewhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
Personalizando 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 um Interface gráfica do usuáriopersonalizado.
Script Local
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Desativar modais de pausa padrão
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Mostrar Interface gráfica do usuáriopersonalizado
else
-- Ocultar Interface gráfica do usuáriopersonalizado
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Modelo de Nível de Detalhe
Quando a transmissão é ativada, Models fora da área atualmente transmetida não será visível por padrão. No entanto, você pode instruir o motor para renderizar malhas de menor resolução "impostor" para modelos que não estão presentes nos clientes através de cada propriedade de LevelOfDetail do modelo.
Configuração de Modelo | Comportamento de streaming |
---|---|
StreamingMesh | Ativa a geração assíncrona de uma malha de impostor para exibir quando o modelo não está presente nos clientes. |
Desativado / Automático | O modelo desaparece quando estiver fora do raio de streaming. |
Ao usar malhas de impostor, observe o seguindo:
- As malhas de impostores são projetadas para serem vistas em 1024 studs afastadas da câmera ou mais. Se você reduziu StreamingTargetRadius para um valor muito menor, como 256, as malhas de impostores podem não ser visivamente aceitáveis para o modelo que eles substituem.
- Se um modelo e seus modelos descendentes estão todos configurados para StreamingMesh , apenas o modelo de ancestral superior é renderizado como um malhade impostor, envoltendo todas as geometrias sob o ancestral, bem como seus modelos descendentes. Para melhor performance, é recomendado que você use Desativado para descendentes modelos.
- Texturas não são suportadas; malhas de impostores são renderizadas como malhas suaves.
- Enquanto um Model não é completamente streamed em, o malware meshes são renderizados em vez de peças individuais do modelo. Quando todos os peças individuais são streamed em, eles renderizam e o malware meshes são ignorados.
- Meshes de impostores não têm significado físico e eles agem como não existentes em relação a raycasting, detecção de colisão e simulação de física.
- Editar um modelo no Studio, como adicionar/deletar/reposicionar peças filhas ou redefinir cores, atualiza automaticamente a malha representativa.