인스턴스 스트리밍

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

경험 내 인스턴스 스트리밍 은 Roblox 엔진이 세계의 지역에서 3D 콘텐츠와 관련된 인스턴스를 동적으로 로드하고 언로드하도록 허용합니다.예를 들어 다음과 같은 방식으로 전체 플레이어 경험을 개선할 수 있습니다.

  • 더 빠른 조인 시간 — 플레이어는 세계의 일부에서 플레이를 시작할 수 있으며, 세계의 나머지가 배경에서 로드됩니다.
  • 메모리 효율성 — 콘텐츠가 동적으로 스트리밍되므로 메모리가 부족한 장치에서 경험을 재생할 수 있습니다.더 몰입감 있고 상세한 세계는 더 넓은 범위의 장치에서 플레이할 수 있습니다.
  • 향상된 성능 — 서버가 세계와 플레이어 사이의 변경 사항을 동기화하는 데 소요되는 시간과 대역폭을 줄일 수 있으므로 이행프레임 속도가 향상됩니다.클라이언트는 현재 플레이어와 관련이 없는 인스턴스를 업데이트하는 데 소요되는 시간을 줄입니다.
  • 세부 수준 — 클라이언트에 스트리밍되지 않는 원거리 모델과 지형은 경험을 최적화하면서 배경 시각을 완전히 희생하지 않고도 계속 표시됩니다.

스트리밍 활성화

인스턴스 스트리밍은 Studio의 스트리밍 활성화 속성의 작업 공간 개체를 통해 활성화됩니다.이 속성은 스크립트에서 설정할 수 없습니다.Studio에서 생성된 새 장소에 기본적으로 스트리밍이 활성화됩니다.

The Properties window with the StreamingEnabled property enabled.

활성화되면 다음 권장 사항을 따르는 것이 좋습니다:

  • 클라이언트는 일반적으로 전체 Workspace 를 로컬에서 사용할 수 없으므로, 인스턴스가 LocalScript에 액세스하기 전에 존재하는지 확인하기 위해 적절한 도구/API를 사용하십시오.예를 들어, 모델별 스트리밍 컨트롤을 사용하거나, 인스턴스 스트리밍 감지를 사용하거나, 존재하지 않을 수 있는 개체에 를 사용합니다.
  • 3D 콘텐츠를 Workspace에 배치하는 것을 최소화합니다.컨테이너에 있는 콘텐츠(예: ReplicatedStorage 또는 ReplicatedFirst)는 스트리밍에 적격하지 않으며 조인 시간과 메모리 사용에 부정적인 영향을 미칠 수 있습니다.
  • 플레이어의 캐릭터를 설정하여 CFrame로 이동하면 서버 측 Script에서 수행하고 스트리밍 요청을 사용하여 플레이어의 새 위치 주변의 데이터를 더 빨리 로드합니다.
  • 플레이어의 ReplicationFocus 를 수동으로 설정하는 유일한 상황은 경험에서 Player.Character 를 사용하지 않는 상황과 같이 특별한 상황입니다.이 경우 플레이어가 제어하는 개체(들)에 초점이 가까이 있는지 확인하여 플레이어의 상호 작용 지점 주변에서 콘텐츠가 계속 스트리밍되도록 합니다.

기술 행동

스트림 넣기

기본적으로, 플레이어가 인스턴스 스트리밍을 활성화한 경험에 참여할 때, Workspace 의 인스턴스는 클라이언트에 복제되고, 팔로잉제외합니다

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

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

모델 행동

기본 동작이 아닌 동작으로 설정된 모델은 아토믹 스트림을 특정 규칙에 따라 특별한 동작으로 처리하여 모델 스트리밍 컨트롤에 설명된 것과 같습니다.그러나 기본(비아토믹) 모델은 ModelStreamingBehavior기본 ( 레거시 ) 또는 향상 으로 설정되는지에 따라 다르게 전송됩니다.

The Properties window with the ModelStreamingBehavior property set to Default.

모델 스트리밍 행동이 기본 / 레거시로 설정되면 플레이어가 참여할 때 컨테이너와 그 비공간 후손(예: )이 클라이언트에 복제됩니다.그런 다음, 적격하면 모델의 BasePart 하위 스트림이 들어옵니다.

Diagram showing default model stream in behavior.

스트림 아웃

게임 플레이중에 클라이언트는 Workspace 플레이어의 영역과 내부에 포함된 BaseParts 을 스트리밍하여 StreamOutBehavior 에 의해 설정된 행동에 따라 제거할 수 있습니다.프로세스는 플레이어의 캐릭터에서 가장 멀리 떨어진 지역(또는 ReplicationFocus)부터 시작하여 필요에 따라 더 가까이 이동합니다.StreamingMinRadius 범위 내의 지역은 결코 스트리밍되지 않습니다.

인스턴스가 스트리밍되면 nil 에 부모가 되어 기존 Luau 상태가 재연결되도록 합니다.결과적으로, 또는 신호는 부모의 또는 조상의 에서 발생하지만, 인스턴스 자체는 호출과 동일한 의미로 파괴되지 않습니다.

스트림 출력을 계속 예측하려면 다음 시나리오를 살펴보세요: To further anticipate stream out, examine these scenarios:

시나리오예시스트리밍 행동
부품은 생성되었습니다 로컬에서 Class.Instance.new()``Class.LocalScript 로 생성되었습니다.플래그 캡처 게임에서는 LocalScript를 통해 파란 팀의 모든 플레이어에게 파란색 헬멧 부품을 생성하고 연결합니다.부품은 서버에 복제되지 않으며, 플레이어의 캐릭터 모델 내의 부품과 같이 서버에 존재하는 부품의 후손으로 만들지 않는 한 제외됩니다 .
부품은 로컬로 복제되었습니다 로부터 ReplicatedStorage 를 통해 Instance:Clone() 에서 LocalScript 에서 복제됩니다.마법사 캐릭터는 를 활성화하여 여러 특수 효과를 포함하는 개체를 복제하고 마법사의 위치에서 작업 영역으로 부모로 지정하여 주문을 던집니다.부품은 서버에 복제되지 않으며, 서버에 존재하는 부품의 후손으로 만들지 않는 한 제외 스트리밍되지 않습니다.
부품은 수리되었습니다 에서 작업 영역으로 를 통해 이동됩니다.마법사의 모자는 ReplicatedStorage에 저장됩니다.플레이어가 마법사 팀에서 플레이하기로 선택하면 모자가 LocalScript를 통해 캐릭터 모델로 이동됩니다.부품은 서버에서 왔고 ReplicatedStorage로 복제되었으므로 스트리밍에 여전히 적합합니다.클라이언트와 서버 사이에서 비동기화를 일으키고 부품이 스트리밍될 수 있기 때문에 이 패턴을 피하십시오; 대신 부품을 복제 하십시오.

모델 행동

모델 스트리밍 행동 을 향상 으로 설정하면 엔진이 스트리밍할 수 있는 경우 기본 ( 비아토믹 ) 모델을 스트리밍할 수 있으며, 클라이언트의 메모리를 해제하고 속성 업데이트가 필요한 인스턴스를 줄일 수 있습니다.

The Properties window with the ModelStreamingBehavior property set to Improved.

개선된 모델 스트리밍 동작 아래에서, 기본 (비아토믹) 모델에서 스트리밍되는 것은 모델이 공간인지( 자식이 있음)인지 아니면 공간이 아닌지( 자식이 없음)에 따라 기반입니다.

  • 공간 모델은 마지막으로 남은 BasePart 하위 모델이 스트림을 완전히 방출할 때만 스트림이 완전히 방출되며, 모델의 일부 공간 부분이 플레이어/복제 초점에 가까울 수도 있고 멀리 있을 수도 있기 때문입니다.
  • 비공간 모델은 조상이 스트림을 내놓을 때만 스트림이 나오며, 레거시 스트림 아웃 동작과 동일합니다.

어셈블리 및 메커니즘

어셈블리의 적어도 하나의 부분이 스트리밍에 적합할 때, 모든 어셈블리 부품도 스트리밍됩니다.그러나 어셈블리는 부품 전체가 스트리밍에 적합해질 때까지 스트림을 방출하지 않습니다.스트리밍 중에는 모든 및 가 내려오고 원자 또는 영구 도 스트리밍되며, 클라이언트에서 일관된 물리 업데이트를 보장하는 데 도움이 됩니다.

고정된 부착된 부품이 있는 어셈블리는 고정되지 않은 부품만 있는 어셈블리와 약간 다르게 처리됩니다:

조립 구성스트리밍 행동
고정되지 않은 부품만전체 어셈블리가 원자 단위로 전송됩니다.
고정된 루트 부분스트리밍된 부품을 루트 부품에 연결하는 데 필요한 부품, 부착물 및 제약 조건만 함께 스트리밍됩니다.

지연 시간

서버에서 부품이 생성되고 클라이언트에 복제될 때의 약간의 지연이 ~10밀리초 있을 수 있습니다.다음 시나리오 각각에서는 이벤트와 속성 업데이트가 항상 파트 스트리밍과 동시에 발생하는 것을 가정하는 대신 WaitForChild() 및 기타 기술을 사용해야 할 수 있습니다.

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

스트리밍 속성

다음 속성은 인스턴스 스트리밍이 경험에 적용되는 방식을 제어합니다.이러한 모든 속성은 스크립트할 수 없음 이며 Studio의 작업 공간 개체에 설정해야 합니다.

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

모델 스트리밍 행동 ModelStreamingBehavior

플레이어가 참여할 때 기본(비아토믹) 모델을 복제하는지 또는 필요할 때만 전송하는지 여부를 제어합니다.이 속성이 향상됨 으로 설정되면 Workspace의 모델은 필요할 때만 클라이언트에 전송되고, 가입 시간이 단축될 수 있습니다.자세한 내용은 기술 행동을 참조하십시오.

스트리밍 무결성 모드

플레이어가 자신에게 스트리밍되지 않은 세계의 지역으로 이동하면 경험이 의도하지 않은 방식으로 작동할 수 있습니다. 스트리밍 무결성 기능은 잠재적으로 문제가 될 수 있는 상황을 피할 수 있는 방법을 제공합니다.자세한 내용은 Enum.StreamingIntegrityMode 문서를 참조하십시오.

스트리밍 미니 라디우스

StreamingMinRadius 속성은 플레이어의 캐릭터(또는 ReplicationFocus) 주위의 반경을 나타내며, 가장 높은 우선 순위로 스트림이 들어오는 인스턴스를 나타냅니다.기본값을 늘리는 경우 다른 구성 요소에 대한 메모리와 서버 대역폭이 더 필요하기 때문에 주의해야 합니다.

스트리밍 대상 반경

스트리밍 대상 반경 속성은 스트림이 들어오는 인스턴스의 플레이어 캐릭터(또는 )에서 최대 거리를 제어합니다.엔진은 메모리 허용 범위 내에서 목표 반경을 넘어 이전에 로드된 인스턴스를 유지할 수 있도록 허용됩니다.

더 작은 스트리밍 대상 반경 은 서버가 설정된 값 이상의 추가 인스턴스에서 스트리밍하지 않으므로 서버 부하가 줄어듭니다.그러나 목표 반경은 플레이어가 경험의 전체 세부 정보를 볼 수 있는 최대 거리이기도 하므로 이 사이에서 균형을 유지하는 값을 선택해야 합니다.

스트림아웃 행동

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

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

모델별 스트리밍 제어

전역적으로 모델 스트리밍 행동 속성을 사용하면 모델이 조인할 때 스트리밍되는 방식을 제어할 수 있습니다.또한, 모델당 스트리밍에서 문제를 피하고 WaitForChild() 의 사용을 최소화하려면 Models 및 그 후손이 자신의 ModelStreamingMode 속성을 통해 스트리밍하는 방법을 사용자 지정할 수 있습니다.

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

기본 / 비아토믹

가 기본값 또는 비아토믹 으로 설정되면 스트리밍 행동은 모델스트리밍 행동 ( 레거시 ) 또는 향상된 으로 설정되는지에 따라 다릅니다.

모델 스트리밍 행동 ModelStreamingBehavior기술 행동
기본 ( 레거시 )플레이어가 참여하면 모델이 복제됩니다.이로 인해 로드 중에 더 많은 인스턴스가 전송되고, 메모리에 더 많은 인스턴스가 저장되며, 모델의 후손에 액세스하려는 스크립트에 대한 추가 복잡성이 발생할 수 있습니다.예를 들어, 별도의 LocalScript 는 모델 내의 하위 모델 WaitForChild() 에서 BasePart 을 사용해야 합니다.
향상됨 모델은 필요할 때만 전송되며, 가입 시간을 단축할 수 있습니다.

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

원자성

가 아토믹 으로 변경되면 하위 요소 중 하나라도 하위 요소가 적격할 때 함께 스트리밍됩니다.결과적으로, 모델에서 인스턴스에 액세스해야 하는 별도의 LocalScript 는 모델 자체에서 WaitForChild() 를 사용해야 하지만, 내림자 MeshPart 또는 하위 모델 Part 에는 모델과 함께 전송되기 때문에 사용할 수 없습니다.

원자 모델은 모든 하위 부품이 스트리밍할 수 있을 때만 스트리밍되며, 이 시점에서 전체 모델이 함께 스트리밍됩니다.일반적으로 원자 모델의 일부만 스트리밍되는 경우, 전체 모델과 그 하위 모델은 클라이언트에 남습니다.

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

local Workspace = game:GetService("Workspace")
-- 로드 시 원자 모델이 존재하지 않습니다; WaitForChild()를 사용하세요
local model = Workspace:WaitForChild("Model")
-- 모델과 함께 내려오는 부품이 스트림되어 즉시 액세스할 수 있음
local meshPart = model.MeshPart
local part = model.Part

영구적

영구 모델은 일반 스트리밍에 의해 제한되지 않습니다.플레이어가 참여하고 Workspace.PersistentLoaded 이벤트가 발생하기 직전에 완전한 원자 단위로 전송됩니다.영구 모델과 그 후손은 결코 스트리밍되지 않지만, 별도의 LocalScript 내에서 안전하게 스트리밍하려면 부모 모델에서 WaitForChild() 을 사용하거나 PersistentLoaded 이벤트가 발생할 때까지 기다려야 합니다.

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

local Workspace = game:GetService("Workspace")
-- 로드 시점에 영구 모델이 존재하지 않습니다; WaitForChild()를 사용하세요
local model = Workspace:WaitForChild("Model")
-- 모델과 함께 내려오는 부품이 스트림되어 즉시 액세스할 수 있음
local meshPart = model.MeshPart
local part = model.Part

지속적인PerPlayer

모델이 PersistentPerPlayer로 설정되면 영구에 추가된 플레이어와 동일한 동작을 수행합니다.다른 플레이어의 경우 동작은 아토믹과 동일합니다.플레이어 지속성을 통해 모델을 Model:RemovePersistentPlayer()로 되돌릴 수 있습니다.

영역 스트리밍 요청

플레이어 캐릭터의 CFrame 를 현재로드되지 않은 지역으로 설정하면 스트리밍 일시 중지가 발생합니다, 활성화되어 있는 경우.캐릭터가 특정 영역으로 이동할 것으로 알고 있는 경우 Player:RequestStreamAroundAsync()에 요청하여 서버가 해당 위치 주변의 영역을 클라이언트에 보내도록 요청할 수 있습니다

다음 스크립트는 클라이언트-서버 원격 이벤트를 발사하여 플레이어를 플레이스내로 순간이동하는 방법을 보여줍니다. 캐릭터를 새로운 로 이동하기 전에 스트리밍 요청에서 생성됩니다.

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

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)
로컬스크립트 - 원격 이벤트 발생시키기 LocalScript - Fire Remote Event

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() 을 통해 스트리밍되거나 흘러나오는지 감지하고, 해당 개체를 처리합니다.예를 들어 다음 코드는 태그가 지정된 Light 개체를 스트림 중에 "틱" 루프에 추가하고 스트림이 나갈 때 제거합니다.

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

    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

일시 중지 화면 사용자 지정

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

로컬 스크립트

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는 기본적으로 표시되지 않습니다.그러나 모델에 클라이언트에 없는 모델을 위해 엔진에 낮은 해상도의 "침입자" 메쉬를 렌더링하도록 지시할 수 있습니다. each model's LevelOfDetail 속성을 통해 모델마다.

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스터드 떨어져 있거나 더 멀리 보도록 설계되었습니다.StreamingTargetRadius를 256과 같은 훨씬 더 작은 값으로 줄였다면, 가해자 메쉬는 교체하는 모델에 시각적으로 적합하지 않을 수 있습니다.
  • 모델 그 하위 모델이 모두 스트리밍 메쉬 로 설정되어 있으면, 상위 수준 조상 모델만 가장자리 모델로 렌더링되어 조상과 하위 모델의 모든 기하를 조상으로 래핑합니다.더 나은 이행위해 하위 모델에는 비활성화 를 사용하는 것이 좋습니다.
  • 텍스처는 지원되지 않으며, 가해자 메쉬는 부드러운 메쉬로 렌더링됩니다.
  • While a Model 는 완전히 스트리밍되지 않지만, 사기꾼 메시는 모델의 개별 부품 대신 렌더링됩니다.모든 개별 부품이 스트림되면 렌더링되고 사기꾼 메시가 무시됩니다.
  • 사기꾼 메쉬는 물리적 의미가 없으며 레이캐스팅, 충돌 감지, 물리 시뮬레이션과 관련하여 존재하지 않습니다.
  • 아이 부품을 추가/삭제/재배치하거나 색상을 재설정하는 등 Studio에서 모델을 편집하면 대표 메쉬가 자동으로 업데이트됩니다.