In-experience instance streaming 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 de várias maneiras, por exemplo:
- Tempos de adesão mais rápidos Os jogadores podem começar a jogar em uma parte do mundo enquanto mais do mundo é carregado em segundo plano.
- Eficiência de memória Experiências podem ser jogadas em dispositivos com menos memória, pois o conteúdo é transmitido de forma dinâmica. Mundos mais imersivos e detalhados podem ser jogados em uma ampla gama de dispositivos.
- Melhor desempenho Melhores taxas de quadros e performance, pois o servidor pode gastar menos tempo e largura de banda sincronizando mudanças 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 e terreno distantes permanecem visíveis mesmo quando não são transmitidos aos clientes, mantendo a experiência otimizada sem sacrificar completamente os visuais de fundo.
Ativando o Streaming
O streaming de instância é habilitado através da propriedade StreamingEnabled do objeto Workspace no Studio. Esta propriedade não pode ser definida em um script. O streaming é habilitado por padrão para novos lugares criados no Studio.
Uma vez ativado, é recomendado que você siga as seguintes práticas:
- Como os clientes normalmente não terão todo o Workspace disponível localmente, use a Workspace/ API apropriada para garantir que as instâncias existam antes de tentar acessá-las em um LocalScript. Por exemplo, use controles de streaming por modelo , para detectar streaming de instância ou use WaitForChild() em objetos que podem não existir.
- Minimize a colocação de conteúdo 3D fora de Workspace . Conteúdo em recipientes 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 configurando CFrame, faça isso de um servidor Script e use solicitações de streaming para carregar dados mais rapidamente em torno 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 esteja 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
Transmitindo em
Por padrão, quando um jogador entra em uma experiência com o streaming de Workspacehabilitado, instâncias no Workspace são replicadas para o cliente, excluindo o seguindo:
- Descendentes das instâncias acima
- Instâncias não-replicantes
Então, durante o jogabilidade, o servidor pode transmitir as instâncias necessárias para o cliente, conforme necessário.
Comportamento do Modelo
Modelos configurados para comportamento não padrão, como Atomic stream em regras especiais, conforme descrito em Per-Model Streaming Controls . No entanto, os modelos padrão (não atômicos) são enviadas de forma diferente com base em se ModelStreamingBehavior é definido como Default ( Legacy ) ou Improved .
Quando ModelStreamingBehavior é definido como Padrão / Legado , o Model contêiner e seus descendentes não espaciais, como Scripts, são replicados para o cliente quando o jogador se junta. Então, quando elegível, os BasePart descendentes do modelo entram.
Transmitindo
Durante a jogabilidade, um cliente pode transmitir (remover das Workspace ) regiões do jogador e as BaseParts contidas 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 intervalo StreamingMinRadius nunca saem.
Quando uma instância flui para fora, ela é relacionada a nil para que qualquer estado Luau existente se reconecte se a instância flui de volta. Como resultado, sinais de remoção como ChildRemoved ou DescendantRemoving atiram em seu pai ou ancestral , mas a própria instância não é destruída no mesmo sentido que uma chamada Instance:Destroy().
Para antecipar ainda mais a transmissão, examine estes cenários:
Escenario | Ejemplo | Comportamiento de streaming |
---|---|---|
Una parte es creada 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 en el servidor, y está exenta de la transmisión 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 es clonada localmente de ReplicatedStorage a través de Instance:Clone() en un LocalScript . | Un personaje mago lanza un hechizo activando un Tool , sobre el que se clona un objeto que incluye varios efectos especiales de ReplicatedStorage y se guarda en el espacio de trabajo en la posición del asistente. | La parte no se replica en el servidor, y está exenta de transmitir a menos que la hagas descendiente de una parte que existe en el servidor. |
Una parte es reparada de ReplicatedStorage al espacio 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 la transmisión, ya que provino del servidor y se replicó a ReplicatedStorage . Evita este patrón, ya que causa una desincronización entre el cliente y el servidor, y la parte puede transmitirse; en su lugar, clona la parte. |
Comportamento do Modelo
Se você definir ModelStreamingBehavior para Improved , o motor pode transmitir Default (Nonatomic) modelos quando forem elegíveis para streaming, potencialmente liberando memória no cliente e reduzindo as instâncias que precisam de atualizações de propriedades.
Sob o comportamento de streaming de modelo aprimorado, o streaming de modelos padrão (não atômicos) é baseado em se o modelo é espacial (contém BasePart descendentes) ou não espacial (contém nenhum BasePart descendentes).
- Um modelo espacial só flui completamente quando seu último descendente BasePart flui, já que algumas das partes espaciais do modelo podem estar perto do foco do jogador/replicação e outras distantes.
- Um modelo não espacial só é transmitido quando um ancestral é transmitido, o que é equivalente ao comportamento de transmissão legado.
Conjuntos e Mecanismos
Quando pelo menos uma parte de um conjunto é elegível para streaming, todas as partes do conjunto também entram. No entanto, um conjunto não irá transmitir para fora até que todas as suas partes sejam elegíveis para streaming. Durante o streaming, todas as Constraints e Attachments descendentes de BaseParts e atômicas ou persistentes Models também entram, ajudando a garantir atualizações consistentes de física nos clientes.
Note que montagens com peças ancoradas são tratadas um pouco diferente de montagens com apenas peças não ancoradas:
Composición de montaje | Comportamiento de streaming |
---|---|
Solo partes no ancladas | El montaje entero se envía como una unidad atómica. |
Parte de raíz anclada | Solo las partes, accesorios y restricciones necesarios para enlazar las partes fluidas con la parte raíz se fluyen juntos. |
Atraso de Tempo
Pode haver um ligeiro atraso de ~10 milissegundos entre quando uma peça é criada no servidor e quando é replicada aos 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 propriedades sempre ocorrem ao mesmo tempo que a transmissão da peça.
Escenario | Ejemplo | Comportamiento de streaming |
---|---|---|
Un LocalScript hace una RemoteFunction llamada al servidor para crear una parte. | Un jugador activa un Tool localmente para generar una parte en el servidor que todos los jugadores puedan ver e interactuar. | Cuando la función remota regrese al cliente, es posible que la parte aún no exista, aunque la parte esté cerca del enfoque del cliente y dentro de un área transmitida. |
Una parte se añade a un modelo de personaje en el servidor a través de un Script y un RemoteEvent se dispara 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 adjunta al aplicación de modeladode personaje del jugador. Un RemoteEvent es disparado y recibido por el cliente de ese jugador para actualizar un elemento de interfaz de usuario local. | Aunque el cliente reciba la señal del 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 activa un RemoteEvent en el cliente. | Un jugador lanza un balón de fútbol a una portería, lo que desencadena un evento de "gol marcado." | Otros jugadores que están cerca de la portería pueden ver el evento "gol marcado" antes de que el balón se les haya transmitido. |
Propriedades de Streaming
As seguintes propriedades controlem como o streaming de instância se aplica à sua experiência. Todas essas propriedades são não programáveis e devem ser definidas no objeto Workspace no Studio.
Comportamento de ModelStreaming
Controla se Modelos Padrão (Não Atômicos) são replicados quando um jogador se junta, ou só são enviadas quando necessário. Se esta propriedade estiver definida como Melhorada , os modelos em Workspace só serão enviados aos clientes quando necessário, potencialmente acelerando os tempos de adesão. 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 tenha sido transmitida para ele. A função integridade de streaming oferece uma maneira de evitar essas situações potencialmente problemáticas. Por favor, consulte a Enum.StreamingIntegrityMode documentação para mais detalhes.
StreamingMinRadius
A propriedade StreamingMinRadius indica o raio ao redor do personagem do jogador (ou ReplicationFocus ) 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.
StreamingTargetRadius
A propriedade StreamingTargetRadius controla a distância máxima do personagem do jogador (ou ReplicationFocus ) em que as instâncias são transmitidas. Observe que o mecanismo pode reter instâncias carregadas anteriormente além do raio do alvo, se a memória permitir.
Um StreamingTargetRadius menor reduz a carga de trabalho do servidor, pois o servidor não transmitirá 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 streaming out comportamento de acordo com um dos seguintes valores:
Ajustes | Comportamiento de streaming |
---|---|
Por defecto | Comportamiento predeterminado, actualmente el mismo que LowMemory . |
Baja Memoria | El cliente solo transmite partes en una situación de bajo almacenamiento y puede eliminar 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 almacenamiento. En este modo, el cliente nunca elimina las instancias que están más cerca que el radio de destino, excepto en situaciones de bajo almacenamiento. |
Controles de streaming por modelo
Globalmente, a propriedade ModelStreamingBehavior permite que você controla como os modelos são transmitidos no join. Além disso, para evitar problemas com o streaming 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 com base em se ModelStreamingBehavior é definido como Padrão ( Legacy ) ou Melhorado .
Comportamiento de transmisión de modelos | Comportamiento técnico |
---|---|
Por Defecto ( Legado ) | El modelo se replica cuando un jugador se une. Esto potencialmente da como resultado más instancias enviadas durante la carga, más instancias almacenadas en el almacenamiento y complejidad adicional para los scripts que quieren acceder a los descendientes del aplicación de modelado. Por ejemplo, un LocalScript separado necesitará usar WaitForChild() en un descendiente BasePart dentro del aplicación de modelado. |
Mejorado | El modelo solo se envía cuando es necesario, lo que potencialmente acelera los tiempos de unirse. |
Veja Comportamento Técnico para mais detalhes.
Atômico
Se um Model for alterado para Atomic , todos os seus descendentes são transmitidos juntos quando um descendente BasePart é elegível. Como resultado, um LocalScript separado que precisa acessar instâncias no modelo precisaria usar WaitForChild() no próprio modelo, mas não em um descendente MeshPart ou Part desde que são enviadas ao lado do modelo.
Um modelo atômico só é transmitido quando todas as suas partes descendentes são elegíveis para streaming, ponto em que todo o modelo é transmitido em conjunto. Se apenas algumas partes de um modelo atômico normalmente fossem transmitidas, todo o modelo e seus descendentes permanecem no cliente.
Scripts Locais
-- O modelo atômico não existe no momento do carregamento; use WaitForChild ()local model = workspace:WaitForChild("Model")-- Peças descendentes fluem com o modelo e são imediatamente acessíveislocal meshPart = model.MeshPartlocal part = model.Part
Persistente
Modelos persistentes não estão sujeitos a streaming normal. Eles são mandados como uma unidade atômica completa logo após o jogador se juntar e antes do evento Workspace.PersistentLoaded. Modelos persistentes e seus descendentes nunca são transmitidos, mas para lidar com o streaming de forma segura dentro de um LocalScript separado, você deve usar WaitForChild() no modelo pai, ou esperar que o evento PersistentLoaded Iniciar / executar.
Scripts Locais
-- O modelo persistente não existe no momento do carregamento; use WaitForChild ()local model = workspace:WaitForChild("Model")-- Peças descendentes fluem com o modelo e são imediatamente acessíveislocal meshPart = model.MeshPartlocal part = model.Part
PersistentePorJogador
Modelos definidos como PersistentePerPlayer se comportam como Persistente para jogadores que foram adicionados usando Model:AddPersistentPlayer() . Para outros jogadores, o comportamento é o mesmo que Atomic . Você pode reverter um modelo da persistência do jogador através de Model:RemovePersistentPlayer() .
Solicitando Streaming de Área
Se você definir o CFrame de um personagem de jogador para uma região que não está atualmente carregada, a pausa de streaming ocorrerá, se ativada. 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 em torno desse local para o cliente.
Os seguintes scripts mostram como disparar um evento remoto cliente-servidor para teletransportar um jogador dentro de um local, cedendo ao pedido de streaming antes de mover o personagem para um novo CFrame .
Script - Teleportar o 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 alvo
player:RequestStreamAroundAsync(teleportTarget)
-- Personagem teletransportado
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Chamar a função de teletransporte quando o cliente disparar o evento remoto
teleportEvent.OnServerEvent:Connect(teleportPlayer)
LocalScript - Evento Remoto de Incêndio
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Lançar o evento remototeleportEvent:FireServer(teleportTarget)
Detectando Streaming de Instância
Em alguns casos, é necessário detectar quando um objeto entra ou sai e reage 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 Tag Editor do Studio, atribua uma tag lógica CollectionService a todos os objetos afetados.
A partir de um único LocalScript, detecte quando um objeto marcado entra ou sai através de GetInstanceAddedSignal() e GetInstanceRemovedSignal(), e manipule o objeto em conformidade. Por exemplo, o código a seguir adiciona objetos marcados Light a um loop de "flicker" quando eles entram e os removem quando saem.
LocalScript - Detecção de Streaming do CollectionServicelocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- Detecte peças marcadas atuais e novas entrando ou saindofor _, 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)-- Laço cintilantewhile 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. Esta propriedade pode ser usada com uma conexão GetPropertyChangedSignal() para mostrar ou esconder uma Interface gráfica do usuáriopersonalizada.
Scripts Locais
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Desativar 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 está ativado, Models fora da área atualmente transmitida não será visível por padrão. No entanto, você pode instruir o mecanismo a renderizar malhas de "imposter" de resolução menor para modelos que não estão presentes em clientes através da propriedade LevelOfDetail de cada modelo.
Configuración del modelo | Comportamiento de streaming |
---|---|
Streaming-Mesh | 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. |
Ao usar malhas de impostor, observe o seguindo:
- Malhas de impostor são projetadas para serem vistas a 1024 studs de distância da câmera ou mais. Se você reduziu StreamingTargetRadius para um valor muito menor, como 256, as malhas de impostor podem não ser visualmente aceitáveis para o modelo que elas substituem.
- Se um modelo e seus modelos descendentes estiverem configurados para StreamingMesh , apenas o modelo ancestral de nível superior será renderizado como uma malha impostora, envolvendo todas as geometrias sob o ancestral, bem como seus modelos descendentes. Para um melhor performance, é recomendado que você use Desativado para modelos descendentes.
- Texturas não são suportadas; malhas de impostor são renderizadas como malhas lisas.
- Embora um Model não seja completamente transmitido, a malha de impostor é renderizada em vez de partes individuais do modelo. Quando todas as partes individuais são transmitidas, elas são renderizadas e a malha de impostor é ignorada.
- Malhas de impostores não têm significado físico e agem como inexistentes em relação a irradiação , detecção de colisão e simulação de física.
- Editar um modelo no Studio, como adicionar/deletar/reposicionar partes infantis ou redefinir cores, atualiza automaticamente a malha representativa.