인스턴스 스트림

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

경험 내 Roblox 엔진이 3D 콘텐츠 및 관련 인스턴스를 지역 수준의 Roblox 엔진에서 동적으로 로드하고 해제하게 합니다. 이렇게 하면 플레이어가 여러 방법으로 플레이어 경험을 향상시킬 수 있습니다. 예를 들어:

  • 더 빠른 참가 시간 — 플레이어는 세계의 더 많은 부분이 백그라운드에서 로드될 때 세계를 플레이할 수 있습니다.
  • 메모리 효율 — 콘텐츠가 동적으로 스트리밍되고 나가기 때문에 메모리가 적은 장치에서 플레이할 수 있습니다. 더 몰입감 있고 세부 정보가 더 많은 세계를 더 넓은 범위의 장치에서 플레이할 수 있습니다.
  • 성능 향상 — 서버가 세계와 플레이어 간의 변경 사항을 동기화하는 데 걸리는 시간과 대역폭을 줄이면서 더 나은 프레임 속도를 제공합니다. 클라이언트는 플레이어가 현재 관련이 없는 인스턴스를 업데이트하는 시간을 줄입니다.
  • 세부 정보 수준 — 멀리 있는 모델과 지형은 클라이언트에 스트림되지 않더라도 볼 수 있으며 경험을 최적화하면서 배경 시각적 개체를 완전히 포기하지 않습니다.

스트리밍 활성화

스트림 속성은 Studio의 작업 공간 개체의 스트림 속성을 통해 구현됩니다. 이 속성은 스크립트에서 설정할 수 없습니다. 스트림은 Studio에서 생성된 새로운 장소에 대해 기본적으로 활성화됩니다.

The Properties window with the StreamingEnabled property enabled.

활성화되면 다음 모범 사례를 준수하는 것이 좋습니다.

  • 클라이언트는 일반적으로 Workspace 를 로컬에서 사용할 수 있는 전체 리소스를 가지고 있지 않으므로 적절한 도구/API를 사용하여 인스턴스가 있는지 확인하십시오. 예를 들어, per-model 스
  • Class.Workspace 외부에 있는 3D 콘텐츠 배치를 최소화합니다. 콘테이너, 예를 들어 ReplicatedStorage 또는 ReplicatedFirst와 같은 컨테이너에 있는 콘텐츠는 스트리밍에 적격하지 않으며 메모리 사용에 부정적인 영향을 미칠 수 있습니다.
  • 플레이어의 캐릭터를 설정하여 이동하면 서버 사이드 CFrame 에서 하고 스트리밍 요청 을 사용하여 캐릭터의 새로운 위치에 대한 데이터를 더 빠르게 로드하십시오.
  • 플레이어의 ReplicationFocus 을 수동으로 설정하려면 경험에서 Player.Character 을 사용하지 않는 고유한 상황에서만 수행해야 합니다. 이 경우 플레이어가 컨텐츠를 스트림하는 주위의 플레이어 컨트롤 개체에 집중하도록

기술 동작

스트리밍에

기본적으로 플레이어가 인스턴스 스트림이 활성화된 경험에 참여할 때, Workspace의 인스턴스는 클라이언트에 복제되지만, 제외는 팔로잉같습니다.

그런 다음 게임 플레이 중에 서버는 필요한 인스턴스를 클라이언트에 스트림할 수 있습니다, 필요할 때.

Diagram showing when various instances and their descendants in the Workspace stream in.
1 지형은 경험이 로드될 때 클라이언트에 복제되지만, 지형 영역은 필요할 때만 스트림됩니다.

모델 동작 분석

특수 규칙에 따라 원자 스트림을 특수 행동으로 설정하면 모델이 Per-Model Streaming Controls 아래에 있는 특수 규칙에 따라 다르게 보냅니다. 그러나 기본(non-átom) 모델은 모델 스트림 동작

The Properties window with the ModelStreamingBehavior property set to Default.

모델 스트림 동작 변경 사항을 기본으로 / 유산 로 설정할 때, Class.Model 컨테이너와 그 비스팩 내 컨테이너인 1> Class.Script|Scripts1>는 클라이언트에 복제됩니다.

Diagram showing default model stream in behavior.

스트림 아웃

게임 플레이어중에 클라이언트가 스트림 아웃 (플레이어Workspace 내의 지역 및 BaseParts 내의 지역) 영역 및 스트림 아웃 기반의 프로세스

인스턴스가 스트림아웃되면 nil 에 부모로 지정되므로 인스턴스가 스트림백에 다시연결되면 모든 기존 Luau 상태가 다시연결됩니다. 결과적

스트림 아웃을 더 예상하려면 다음 시나리오를 검토하십시오.

시나리오예시스트리밍 동작
부품은 로컬 에서 생성된 후 Instance.new() 에 있는 LocalScript 에 있습니다.In a "Capture the flag" 게임, you create and attach blue helmet parts to all players on the blue team through a LocalScript .부품은 서버에 복제되지 않으며 서버에서 스트리밍하지 않습니다. 을 제외하고 부품은 플레이어의 캐릭터 모델과 같은 서버에 존재하는 부품의 후손입니다.
부품은 클론 로컬에서 ReplicatedStorage 를 통해 Instance:Clone() 에 대한 1> Class.LocalScript1> 입니다.마법사 캐릭터는 Tool를 활성화하여 특수 효과 를 포함하는 개체를 클론하고, 마법사 위치의 작업 공간에 부모로 지정됩니다.부품은 서버에 복제되지 않으며 서버에 존재하는 부품의 후손이 아닙니다. 을 제외하고 부품이 서버에 있는 부품의 후손이 아닙니다.
부품은 Reparented ReplicatedStorage에서 작업 공간으로 연결하는 중간에 있습니다.마법사의 모자는 ReplicatedStorage 에 저장됩니다. 플레이어가 마법사의 팀에 플레이하도록 선택하면 모자가 자동으로 캐릭터 모델로 이동됩니다. LocalScript 을 통해 말 그대로 마법사의 모자를 캐릭터에 이동합니다.부품은 서버에서 복제되어 ReplicatedStorage 로 스트리밍 될 수 있으므로 이 부품이 클라이언트와 서버 간의 싱크를 유발하므로 이 패턴을 피하십시오. 대신, 클론 부품을 클라이언트에 복제하십시오.

모델 동작 분석

ModelStreamingBehavior를 Improved 로 설정하면 엔진은 스트림 출력을 기본으로 변경하여 클라이언트에서 메모리를 해제하고 속성 업데이트가 필요한 인스턴스를 줄일 수 있습니다.

The Properties window with the ModelStreamingBehavior property set to Improved.

개선된 모델 스트림 동작, 기본 모델(원자 모델)에서 스트림 아웃은 모델이 공간 (1>기본1> 하위 모델) 이거나 아님에 따라 기반합니다.

  • 모델의 마지막 남은 후손인 BasePart 스트림이 완전히 나오면 모델의 나머지 부분이 플레이어/복제 집중 및 멀리 있기 때문에 모델의 나머지 부분이 플레이어/복제 집중 및 멀리 있기 때문에 나머지 부분이 플레이어/복제 집중 및 멀리 있기 때문에 나머지 부분이 플레이어/복
  • 공간이 아닌 모델은 조상이 스트림아웃할 때만 스트림을 내보내며, 이전 스트림아웃 동작과 동일합니다.

조립 및 메커니즘

Assembly의 최소 하나의 부품이 스트리밍 가능한 경우, 모든 부품도 스트리밍됩니다. 그러나 모든 부품이

앵커된 부품이 있는 어셈블리는 단순히 앵커된 부품이 없는 어셈블리와 약간 다르게 취급됩니다:

조립 구성스트리밍 동작
고정되지 않은 부품만전체 조립은 원자 단위로 보냅니다.
앵커 루트 부품스트림된 부품을 루트 부품에 연결하는 데 필요한 부품, 부착 및 제약 사항만 스트림됩니다.

지연 시간

서버에서 부품을 생성하고 클라이언트에 복제하는 시간 간의 약간의 지연이 있을 수 있습니다. 다음 시나리오 중 각각에서 이 기간을 WaitForChild() 및 기타 기술을 사용하는 대신 가정하는 경우 이벤트 및 속성 업데이트가 항상 부품 스트림에

시나리오예시스트리밍 동작
Class.LocalScript는 서버에서 부품을 생성하기 위해 RemoteFunction을 호출합니다.플레이어가 Tool를 로컬로 활성화하여 모든 플레이어가 볼 수 있고 상호 작용할 수 있는 서버의 부품을 생성합니다.원격 함수가 클라이언트에 반환되면 부품이 클라이언트 초점 및 스트림 영역 내에 있더라도 부품이 아직 존재하지 않을 수 있습니다.
서버의 캐릭터 모델에 Script를 통해 부품이 추가되고 RemoteEvent가 클라이언트에서 실행됩니다.플레이어가 경찰 팀에 합류하면 ServerStorage 에 저장된 경찰 배지 부분이 복제되어 플레이어의 캐릭터 모델에 부착됩니다. RemoteEvent 가 실행되고 플레이어의 클라이언트에서 로컬 UI 요소를 업데이트하기 위해 경찰 배지클라이언트가 이벤트 신호를 수신하지만, 부품이 이미 클라이언트에 스트림되었는지 보장할 수는 없습니다.
서버와 부품 사이에 투명한 영역이 충돌하고 클라이언트에서 RemoteEvent를 트리거합니다.플레이어가 축구 공을 목표물에 찬 후, "골 득점" 이벤트를 트리거합니다.목표에 가까운 다른 플레이어는 공이 그들에게 스트림되기 전에 "목표 점수" 이벤트를 볼 수 있습니다.

스트리밍 속성

다음 속성은 인스턴스 스트림이 경험에 적용되는 방법을 제어합니다. 이 모든 속성은 스크립트 가능하며 Studio의 작업 공간 개체에 설정해야 합니다.

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

모델 스트림 동작

플레이어가 가입할 때 기본 (비원자 ) 모델이 복제되는지 여부를 제어합니다. 이 속성이 개선 으로 설정된 경우 1>필요할 때만1> 모델이 클라이언트에 보내됩니다. 이 속성이 4>개선

스트리밍 무결성 모드

플레이어가 세계의 지역으로 이동하여 스트림되지 않은 경우 경험은 예기치 않은 방식으로 작동할 수 있습니다. 스트림 무결성 기능은 이러한 문제적인 상황을 피할 수 있는 방법을 제공합니다. 자세한 내용은 Enum.StreamingIntegrityMode 문서를 참조하십시오.

스트림 미니 라디오

StreamingMinRadius 속성은 플레이어의 캐릭터(또는 Class.Player.ReplicationFocus|ReplicationFocus) 주위의 스트림이 가장 우선 순위가 높은 경우의 라디우스를 나타냅니다. 기본값을 높이면 메모리와 서버 대역폭을 위해 더 많은 메모리가 필요해지므로 주의해야 합니다.

스트리밍 대상 반경

StreamingTargetRadius 속성은 플레이어의 캐릭터(또는 Class.Player.ReplicationFocus|ReplicationFocus)에서 스트림이 있는 최대 거리를 제어합니다(또는 엔진이 이전에 로드된 인스턴스를 넘어가도 메모리 허용). 注意 엔진은 대상 영역 밖의 이전에 로드된 인스턴스를 유지할 수 있습니다.

더 작은 StreamingTargetRadius 는 서버 워크로드를 줄이므로 서버는 설정된 값 이상의 추가 인스턴스에 스트림하지 않습니다. 그러나 대상 라디오는 플레이어가 경험의 전체 세부 정보를 볼 수 있는 최대 거리이므로 이 사이에 균형을 맞출 수 있도록 값을 선택해야 합니다.

스트림 아웃 동작

StreamOutBehavior 속성은 다음 값 중 하나에 따라 스트리밍 종료 동작을 설정합니다.

설정스트리밍 동작
기본 기본 동작, 현재 LowMemory 와 동일합니다.
저메모리 클라이언트는 메모리 상황이 낮을 때만 부품을 스트림하고 최소 반경이 있을 때까지 3D 콘텐츠를 제거할 수 있습니다.
기회주의자 StreamingTargetRadius를 초과하는 지역에서는 메모리 부족 상태에서도 클라이언트에서 제거할 수 있습니다. 이 모드에서는 클라이언트가 대상 범위보다 가까운 인스턴스를 제거하지 않습니다.

모델 별 스트리밍 컨트롤

전 세계적으로 ModelStreamingBehavior 속성을 사용하면 모델이 가입할 때 스트림되는 방법을 제어할 수 있습니다. 또한, 스트림이 모델 기반으로 스트림되고 사용자의 모델 및 후손의 스트림

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

기본/비원자

Class.Model 이 기본으로 설정되거나 원자 아님으로 설정되면 스트리밍 동작은 기본 (1>상속1>) 또는 4>개선4> 에 따라 변경됩니다.

모델 스트림 동작 변경기술 동작
기본 ( 상속 )플레이어가 합류하면 모델이 복제됩니다. 이로 인해 플레로드 시 더 많은 인스턴스가 전송되고, 메모리에 저장된 더 많은 인스턴스가 추가되며, 모델의 후손에 액세스하려는 스크립트에 대한 추가 복잡성
개선됨 모델은 필요할 때만 전송되므로 가입 시간이 지연될 수 있습니다.

자세한 내용은 기술 동작 참조하십시오.

원자

Class.Model 이 으로 변경된 경우 모든 후손이 내려지면 내려진 후손 BasePart

원자 모델은 모든 후손 부품이 스트리밍 대상이 될 때만 스트리밍됩니다. 이때 전체 모델이 함께 스트리밍됩니다. 원자 모델의 일부만 스트리밍되는 경우 전체 모델과 그 하위에 있는 모든 부품은 클라이언트에 있습니다.

A diagram showing Atomic model streaming along with children.
로컬 스크립트

-- Atomic 모델은 로드 시간에 존재하지 않습니다; 대신 WaitForChild() 사용
local model = workspace:WaitForChild("Model")
-- 하위 부품 스트림은 모델과 함께 스트림되며 즉시 액세스할 수 있습니다.
local meshPart = model.MeshPart
local part = model.Part

영구

지속 모델은 일반적인 스트리밍에 대해 노출되지 않습니다. 플레이어가 합류하고 Workspace.PersistentLoaded 이벤트가 발생

A diagram showing Persistent model streaming along with children.
로컬 스크립트

-- Persistent 모델은 로드 시간에 존재하지 않습니다; 대신 WaitForChild() 사용
local model = workspace:WaitForChild("Model")
-- 하위 부품 스트림은 모델과 함께 스트림되며 즉시 액세스할 수 있습니다.
local meshPart = model.MeshPart
local part = model.Part

지속적인 플레이어

PersistentPerPlayer로 설정된 모델은 플레이어가 Persistent를 사용하여 추가된 플레이어와 동일하게 행동합니다. 다른 플레이어의 경우 모델은 Model:AddPersistentPlayer()과 동일합니다. 모델을 플레이어 지속성 기능을 통해 복원할

지역 스트림 요청

플레이어 캐릭터의 CFrame를 현재 로드되지 않은 지역에 설정하면 스트리밍 중지가 발생합니다. 이 경우 플레이어가 특정 지역으로 이동하는 것을 알 수 있습니다. Player:RequestStreamAroundAsync()를 호출하여 서버가 해당

다음 스크립트는 플레이어를 위치에 텔레포트하려면 플레이스서버로 원격 이벤트를 발생시키는 방법을 보여줍니다. 이 스크립트는 캐릭터를 새로운 Datatype.CFrame로 이동하기 전에 스트리밍 요청에 대해 스트림을 반환합니다.

스크립트 - 플레이어 캐릭터 순간이동

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- 대상 위치에 대한 스트리밍 요청
player:RequestStreamAroundAsync(teleportTarget)
-- 캐릭터 이동
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- 클라이언트가 원격 이벤트를 발생시키면 순간이동 함수를 호출합니다.Call teleport function when the client fires the remote event
teleportEvent.OnServerEvent:Connect(teleportPlayer)
로컬 스크립트 - 원격 이벤트 발생

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local teleportTarget = Vector3.new(50, 2, 120)
-- 원격 이벤트 실행
teleportEvent:FireServer(teleportTarget)

인스턴스 스트림 감지

일부 경우, 개체가 들어오거나 나가거나 이벤트에 반응하는 시간을 감지하는 것이 필요합니다. 스트리밍 감지에 유용한 패턴은 다음과 같습니다.

  1. 인스턴스의 속성의 태그 섹션 또는 Studio의 태그 편집기 를 사용하여 모든 영향을 받는 개체에 논리적인 CollectionService 태그를 할당합니다.

  2. 단일 LocalScript 에서 태그가 있는 개체가 스트림을 통해 GetInstanceAddedSignal()GetInstanceRemovedSignal() 을 통해 흐르

    로컬 스크립트 - 컬렉션 서비스 스트리밍 감지

    local CollectionService = game:GetService("CollectionService")
    local tagName = "FlickerLightSource"
    local random = Random.new()
    local flickerSources = {}
    -- 현재 및 새로운 태그가 있는 부품 스트림을 검출하거나 검출하지 않음
    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)
    -- 플리커 루프
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.wait(0.05)
    end

일시 중지 화면 사용자 정의

Class.Player.GameplayPaused 속성은 플레이어의 현재 일시 중지 상태를 나타냅니다. 이 속성은 GetPropertyChangedSignal() 연결을 사용하여 사용자 정의 GUI를 표시하거나 숨길 수 있습니다.

로컬 스크립트

local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- 기본 중지 모달 비활성화
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- 사용자 정의 GUI 표시
else
-- 사용자 정의 GUI 숨기기
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)

세부 정보 모델 수준

스트림이 활성화되면 현재 스트림된 영역 외부에 있는 Models 이 기본적으로 표시되지 않습니다. 그러나 클라이언트를 통해 제공되지 않는 모델의 경우 엔진에 지정된 해상도 미포함 메쉬를 렌더링하도록 지시할 수 있습니다.

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.
현재 모델
The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.
저해상도 메쉬 '사기꾼'
모델 설정스트리밍 동작
스트림 메쉬 클라이언트에 모델이 없는 경우 임포스터 메쉬를 동기화하지 않고 표시하도록 활성화합니다.
비활성화되었습니다. / 자동으로 스트리밍 범위 외부에서 모델이 사라집니다.

사기꾼 메쉬를 사용할 때 팔로잉참조하십시오.

  • 사기꾼 메쉬는 카메라로부터 1024 또는 더 멀리 볼 수 있도록 설계되었습니다. 스트리밍 대상 반경을 256 또는 더 작게 조정하면 사기꾼 메쉬가 모델을 대체하는 모델에 시각적으로 적합하지 않을 수 있습니다.
  • 모델에서 하위 모델은 모두 StreamingMesh로 설정되지만, 상위 수준의 조상 모델은 Disabling으로 렌더링됩니다. 이렇게 하면 하위 모델에 대한 모든 지오메트리를 조상 모델에 묶어 손상을 줄 수 있습니다. 이행향상
  • 텍스처는 지원되지 않습니다. 사기꾼 메쉬는 부드러운 메쉬로 렌더링됩니다.
  • Class.Model 이 완전히 스트림되지 않은 경우, 사기꾼 메쉬는 모델의 개별 부품이 아닌 대신 렌더링됩니다. 모든 개별 부품이 렌더링된 후, 사기꾼 메쉬는 무시됩니다.
  • 사기꾼 메쉬는 물리적 의미가 없으며 레이캐스팅, 충돌 감지 및 물리 시뮬레이션에 대해 존재하지 않습니다.
  • Studio에서 모델을 편집하는 경우, 자식 부품을 추가/삭제하거나 색상을 재조정하는 등의 작업을 수행하면 대표 메쉬가 자동으로 업데이트됩니다.