경험 내 Roblox 엔진이 3D 콘텐츠 및 관련 인스턴스를 지역 수준의 Roblox 엔진에서 동적으로 로드하고 해제하게 합니다. 이렇게 하면 플레이어가 여러 방법으로 플레이어 경험을 향상시킬 수 있습니다. 예를 들어:
- 더 빠른 참가 시간 — 플레이어는 세계의 더 많은 부분이 백그라운드에서 로드될 때 세계를 플레이할 수 있습니다.
- 메모리 효율 — 콘텐츠가 동적으로 스트리밍되고 나가기 때문에 메모리가 적은 장치에서 플레이할 수 있습니다. 더 몰입감 있고 세부 정보가 더 많은 세계를 더 넓은 범위의 장치에서 플레이할 수 있습니다.
- 성능 향상 — 서버가 세계와 플레이어 간의 변경 사항을 동기화하는 데 걸리는 시간과 대역폭을 줄이면서 더 나은 프레임 속도를 제공합니다. 클라이언트는 플레이어가 현재 관련이 없는 인스턴스를 업데이트하는 시간을 줄입니다.
- 세부 정보 수준 — 멀리 있는 모델과 지형은 클라이언트에 스트림되지 않더라도 볼 수 있으며 경험을 최적화하면서 배경 시각적 개체를 완전히 포기하지 않습니다.
스트리밍 활성화
스트림 속성은 Studio의 작업 공간 개체의 스트림 속성을 통해 구현됩니다. 이 속성은 스크립트에서 설정할 수 없습니다. 스트림은 Studio에서 생성된 새로운 장소에 대해 기본적으로 활성화됩니다.
활성화되면 다음 모범 사례를 준수하는 것이 좋습니다.
- 클라이언트는 일반적으로 Workspace 를 로컬에서 사용할 수 있는 전체 리소스를 가지고 있지 않으므로 적절한 도구/API를 사용하여 인스턴스가 있는지 확인하십시오. 예를 들어, per-model 스
- Class.Workspace 외부에 있는 3D 콘텐츠 배치를 최소화합니다. 콘테이너, 예를 들어 ReplicatedStorage 또는 ReplicatedFirst와 같은 컨테이너에 있는 콘텐츠는 스트리밍에 적격하지 않으며 메모리 사용에 부정적인 영향을 미칠 수 있습니다.
- 플레이어의 캐릭터를 설정하여 이동하면 서버 사이드 CFrame 에서 하고 스트리밍 요청 을 사용하여 캐릭터의 새로운 위치에 대한 데이터를 더 빠르게 로드하십시오.
- 플레이어의 ReplicationFocus 을 수동으로 설정하려면 경험에서 Player.Character 을 사용하지 않는 고유한 상황에서만 수행해야 합니다. 이 경우 플레이어가 컨텐츠를 스트림하는 주위의 플레이어 컨트롤 개체에 집중하도록
기술 동작
스트리밍에
기본적으로 플레이어가 인스턴스 스트림이 활성화된 경험에 참여할 때, Workspace의 인스턴스는 클라이언트에 복제되지만, 제외는 팔로잉같습니다.
- 위의 인스턴스들의 후손
- 인스턴스 복제 안 함
그런 다음 게임 플레이 중에 서버는 필요한 인스턴스를 클라이언트에 스트림할 수 있습니다, 필요할 때.
모델 동작 분석
특수 규칙에 따라 원자 스트림을 특수 행동으로 설정하면 모델이 Per-Model Streaming Controls 아래에 있는 특수 규칙에 따라 다르게 보냅니다. 그러나 기본(non-átom) 모델은 모델 스트림 동작
모델 스트림 동작 변경 사항을 기본으로 / 유산 로 설정할 때, Class.Model 컨테이너와 그 비스팩 내 컨테이너인 1> Class.Script|Scripts1>는 클라이언트에 복제됩니다.
스트림 아웃
게임 플레이어중에 클라이언트가 스트림 아웃 (플레이어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 로 설정하면 엔진은 스트림 출력을 기본으로 변경하여 클라이언트에서 메모리를 해제하고 속성 업데이트가 필요한 인스턴스를 줄일 수 있습니다.
개선된 모델 스트림 동작, 기본 모델(원자 모델)에서 스트림 아웃은 모델이 공간 (1>기본1> 하위 모델) 이거나 아님에 따라 기반합니다.
- 모델의 마지막 남은 후손인 BasePart 스트림이 완전히 나오면 모델의 나머지 부분이 플레이어/복제 집중 및 멀리 있기 때문에 모델의 나머지 부분이 플레이어/복제 집중 및 멀리 있기 때문에 나머지 부분이 플레이어/복제 집중 및 멀리 있기 때문에 나머지 부분이 플레이어/복
- 공간이 아닌 모델은 조상이 스트림아웃할 때만 스트림을 내보내며, 이전 스트림아웃 동작과 동일합니다.
조립 및 메커니즘
Assembly의 최소 하나의 부품이 스트리밍 가능한 경우, 모든 부품도 스트리밍됩니다. 그러나 모든 부품이
앵커된 부품이 있는 어셈블리는 단순히 앵커된 부품이 없는 어셈블리와 약간 다르게 취급됩니다:
조립 구성 | 스트리밍 동작 |
---|---|
고정되지 않은 부품만 | 전체 조립은 원자 단위로 보냅니다. |
앵커 루트 부품 | 스트림된 부품을 루트 부품에 연결하는 데 필요한 부품, 부착 및 제약 사항만 스트림됩니다. |
지연 시간
서버에서 부품을 생성하고 클라이언트에 복제하는 시간 간의 약간의 지연이 있을 수 있습니다. 다음 시나리오 중 각각에서 이 기간을 WaitForChild() 및 기타 기술을 사용하는 대신 가정하는 경우 이벤트 및 속성 업데이트가 항상 부품 스트림에
시나리오 | 예시 | 스트리밍 동작 |
---|---|---|
Class.LocalScript는 서버에서 부품을 생성하기 위해 RemoteFunction을 호출합니다. | 플레이어가 Tool를 로컬로 활성화하여 모든 플레이어가 볼 수 있고 상호 작용할 수 있는 서버의 부품을 생성합니다. | 원격 함수가 클라이언트에 반환되면 부품이 클라이언트 초점 및 스트림 영역 내에 있더라도 부품이 아직 존재하지 않을 수 있습니다. |
서버의 캐릭터 모델에 Script를 통해 부품이 추가되고 RemoteEvent가 클라이언트에서 실행됩니다. | 플레이어가 경찰 팀에 합류하면 ServerStorage 에 저장된 경찰 배지 부분이 복제되어 플레이어의 캐릭터 모델에 부착됩니다. RemoteEvent 가 실행되고 플레이어의 클라이언트에서 로컬 UI 요소를 업데이트하기 위해 경찰 배지 | 클라이언트가 이벤트 신호를 수신하지만, 부품이 이미 클라이언트에 스트림되었는지 보장할 수는 없습니다. |
서버와 부품 사이에 투명한 영역이 충돌하고 클라이언트에서 RemoteEvent를 트리거합니다. | 플레이어가 축구 공을 목표물에 찬 후, "골 득점" 이벤트를 트리거합니다. | 목표에 가까운 다른 플레이어는 공이 그들에게 스트림되기 전에 "목표 점수" 이벤트를 볼 수 있습니다. |
스트리밍 속성
다음 속성은 인스턴스 스트림이 경험에 적용되는 방법을 제어합니다. 이 모든 속성은 스크립트 가능하며 Studio의 작업 공간 개체에 설정해야 합니다.
모델 스트림 동작
플레이어가 가입할 때 기본 (비원자 ) 모델이 복제되는지 여부를 제어합니다. 이 속성이 개선 으로 설정된 경우 1>필요할 때만1> 모델이 클라이언트에 보내됩니다. 이 속성이 4>개선
스트리밍 무결성 모드
플레이어가 세계의 지역으로 이동하여 스트림되지 않은 경우 경험은 예기치 않은 방식으로 작동할 수 있습니다. 스트림 무결성 기능은 이러한 문제적인 상황을 피할 수 있는 방법을 제공합니다. 자세한 내용은 Enum.StreamingIntegrityMode 문서를 참조하십시오.
스트림 미니 라디오
StreamingMinRadius 속성은 플레이어의 캐릭터(또는 Class.Player.ReplicationFocus|ReplicationFocus) 주위의 스트림이 가장 우선 순위가 높은 경우의 라디우스를 나타냅니다. 기본값을 높이면 메모리와 서버 대역폭을 위해 더 많은 메모리가 필요해지므로 주의해야 합니다.
스트리밍 대상 반경
StreamingTargetRadius 속성은 플레이어의 캐릭터(또는 Class.Player.ReplicationFocus|ReplicationFocus)에서 스트림이 있는 최대 거리를 제어합니다(또는 엔진이 이전에 로드된 인스턴스를 넘어가도 메모리 허용). 注意 엔진은 대상 영역 밖의 이전에 로드된 인스턴스를 유지할 수 있습니다.
더 작은 StreamingTargetRadius 는 서버 워크로드를 줄이므로 서버는 설정된 값 이상의 추가 인스턴스에 스트림하지 않습니다. 그러나 대상 라디오는 플레이어가 경험의 전체 세부 정보를 볼 수 있는 최대 거리이므로 이 사이에 균형을 맞출 수 있도록 값을 선택해야 합니다.
스트림 아웃 동작
StreamOutBehavior 속성은 다음 값 중 하나에 따라 스트리밍 종료 동작을 설정합니다.
설정 | 스트리밍 동작 |
---|---|
기본 | 기본 동작, 현재 LowMemory 와 동일합니다. |
저메모리 | 클라이언트는 메모리 상황이 낮을 때만 부품을 스트림하고 최소 반경이 있을 때까지 3D 콘텐츠를 제거할 수 있습니다. |
기회주의자 | StreamingTargetRadius를 초과하는 지역에서는 메모리 부족 상태에서도 클라이언트에서 제거할 수 있습니다. 이 모드에서는 클라이언트가 대상 범위보다 가까운 인스턴스를 제거하지 않습니다. |
모델 별 스트리밍 컨트롤
전 세계적으로 ModelStreamingBehavior 속성을 사용하면 모델이 가입할 때 스트림되는 방법을 제어할 수 있습니다. 또한, 스트림이 모델 기반으로 스트림되고 사용자의 모델 및 후손의 스트림
기본/비원자
Class.Model 이 기본으로 설정되거나 원자 아님으로 설정되면 스트리밍 동작은 기본 (1>상속1>) 또는 4>개선4> 에 따라 변경됩니다.
모델 스트림 동작 변경 | 기술 동작 |
---|---|
기본 ( 상속 ) | 플레이어가 합류하면 모델이 복제됩니다. 이로 인해 플레로드 시 더 많은 인스턴스가 전송되고, 메모리에 저장된 더 많은 인스턴스가 추가되며, 모델의 후손에 액세스하려는 스크립트에 대한 추가 복잡성 |
개선됨 | 모델은 필요할 때만 전송되므로 가입 시간이 지연될 수 있습니다. |
자세한 내용은 기술 동작 참조하십시오.
원자
Class.Model 이 핵 으로 변경된 경우 모든 후손이 내려지면 내려진 후손 BasePart
원자 모델은 모든 후손 부품이 스트리밍 대상이 될 때만 스트리밍됩니다. 이때 전체 모델이 함께 스트리밍됩니다. 원자 모델의 일부만 스트리밍되는 경우 전체 모델과 그 하위에 있는 모든 부품은 클라이언트에 있습니다.
로컬 스크립트
-- Atomic 모델은 로드 시간에 존재하지 않습니다; 대신 WaitForChild() 사용local model = workspace:WaitForChild("Model")-- 하위 부품 스트림은 모델과 함께 스트림되며 즉시 액세스할 수 있습니다.local meshPart = model.MeshPartlocal part = model.Part
영구
지속 모델은 일반적인 스트리밍에 대해 노출되지 않습니다. 플레이어가 합류하고 Workspace.PersistentLoaded 이벤트가 발생
로컬 스크립트
-- Persistent 모델은 로드 시간에 존재하지 않습니다; 대신 WaitForChild() 사용local model = workspace:WaitForChild("Model")-- 하위 부품 스트림은 모델과 함께 스트림되며 즉시 액세스할 수 있습니다.local meshPart = model.MeshPartlocal 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)
인스턴스 스트림 감지
일부 경우, 개체가 들어오거나 나가거나 이벤트에 반응하는 시간을 감지하는 것이 필요합니다. 스트리밍 감지에 유용한 패턴은 다음과 같습니다.
인스턴스의 속성의 태그 섹션 또는 Studio의 태그 편집기 를 사용하여 모든 영향을 받는 개체에 논리적인 CollectionService 태그를 할당합니다.
단일 LocalScript 에서 태그가 있는 개체가 스트림을 통해 GetInstanceAddedSignal() 및 GetInstanceRemovedSignal() 을 통해 흐르
로컬 스크립트 - 컬렉션 서비스 스트리밍 감지local CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- 현재 및 새로운 태그가 있는 부품 스트림을 검출하거나 검출하지 않음for _, 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)-- 플리커 루프while true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.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 이 기본적으로 표시되지 않습니다. 그러나 클라이언트를 통해 제공되지 않는 모델의 경우 엔진에 지정된 해상도 미포함 메쉬를 렌더링하도록 지시할 수 있습니다.
모델 설정 | 스트리밍 동작 |
---|---|
스트림 메쉬 | 클라이언트에 모델이 없는 경우 임포스터 메쉬를 동기화하지 않고 표시하도록 활성화합니다. |
비활성화되었습니다. / 자동으로 | 스트리밍 범위 외부에서 모델이 사라집니다. |
사기꾼 메쉬를 사용할 때 팔로잉참조하십시오.
- 사기꾼 메쉬는 카메라로부터 1024 또는 더 멀리 볼 수 있도록 설계되었습니다. 스트리밍 대상 반경을 256 또는 더 작게 조정하면 사기꾼 메쉬가 모델을 대체하는 모델에 시각적으로 적합하지 않을 수 있습니다.
- 모델에서 하위 모델은 모두 StreamingMesh로 설정되지만, 상위 수준의 조상 모델은 Disabling으로 렌더링됩니다. 이렇게 하면 하위 모델에 대한 모든 지오메트리를 조상 모델에 묶어 손상을 줄 수 있습니다. 이행향상
- 텍스처는 지원되지 않습니다. 사기꾼 메쉬는 부드러운 메쉬로 렌더링됩니다.
- Class.Model 이 완전히 스트림되지 않은 경우, 사기꾼 메쉬는 모델의 개별 부품이 아닌 대신 렌더링됩니다. 모든 개별 부품이 렌더링된 후, 사기꾼 메쉬는 무시됩니다.
- Studio에서 모델을 편집하는 경우, 자식 부품을 추가/삭제하거나 색상을 재조정하는 등의 작업을 수행하면 대표 메쉬가 자동으로 업데이트됩니다.