實例流媒

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

在體驗中 實例串流 允許 Roblox 引擎在世界的區域內動態載入和卸載 3D 內容和相關實例。這可以提升玩家體驗,例如:

  • 加速加入時間 — 玩家可以在世界的某個區域開始遊戲,而世界的其他部分在後台載入。
  • 記憶體效率 — 體驗可以在有較少記憶體的設備上播放,因為內容是動態傳輸到和從設備上。更身临其境、更詳細的世界可以在更廣泛的設備上播放。
  • 改善性能 — 更好的額外幀率和履約,因為伺服器可以花費較少的時間和寬廣同步變更之間的玩家間的變更。客戶端花費較少的時間更新不相關的實例,而不是目前對玩家重要的。
  • 細節程度 — 遠程模型和地形仍然可以在不需要傳輸至客戶端時保持可見,以保持體驗最佳化,而不需要完全擊殺背景視圖。

啟用直播

StreamingEnabled 屬性的 Studio 中的工作區對象,可以啟用實例串流。此屬性無法在指令碼中設置。 Streaming 啟用 對於在 Studio 中新建的地方。

The Properties window with the StreamingEnabled property enabled.

啟用後,建議您遵守以下習慣:

  • 因為客戶端通常並不會擁有整個 Workspace 可用在本地,因此使用適當的工具/API 確認客戶端在嘗試使用它們時存在。例如,使用 LocalScript偵測實例串流 或使用
  • 將 3D 內容放置在 Workspace 外面。在容器中,例如 ReplicatedStorageReplicatedFirst 中,內容無法流式傳輸,可能導致加入時間和內存使用率。
  • 如果您移動玩家的角色設置其 CFrame ,從服務器側面 Script 並使用 串流請求 更快地載入資料在角色的新位置。
  • 手動設置玩家的 ReplicationFocus 只在特定情況,例如在不使用 Player.Character 的體驗。在這些情況下,請確保焦點靠近玩家控制的對象,以確保內容繼續在玩家的互動點上流動。

技術行為

預設情況下,當玩家加入啟用實例直播的體驗時,Workspace 中的實例會自動複製到客戶端,除外以追蹤中內容:

然後,在遊玩玩法中,伺服器可能會將必要的實例流向客戶,以便能夠正常運行。

Diagram showing when various instances and their descendants in the Workspace stream in.
1 地形會以獨特的方式處理,因為體驗載入時,客戶端會重複到地形區域,但僅在需要時才會流動

模型行為

將模型設置為非預設行為,例如 Atomic 流程在特殊規則下發生,並且按照 Per Model Streaming Controls 中的說明進行發送。 但是,預設 (非原子) 模型會以不同的方式發送,因為是否設置 ModelStreamingBehavior 為 1>預設1> (或 4>Legacy</

The Properties window with the ModelStreamingBehavior property set to Default.

模型暢享行為 設為 預設值 / 傳承值 時, 1> Class.Model 容器和其非空間後代,例如4> Class.Script|Scripts 4> 在玩家加入時重複到客戶端。然後,當有資格時,模型的 <

Diagram showing default model stream in behavior.

播放出

在遊遊玩中,客戶端可能會流出 (從玩家的 Workspace 區域和內含的 BaseParts 區域,按照 StreamOutBehavior 的行為設定來進行。 過程開始於區域最遠

當實例串流出時,它會與 nil 相關,以便任何現有 Luau 狀態在實際上重新連接。因結果,如果實例串回來,ChildRemoved

為了進一步預測播放量,請檢視這些場景:

場景範例流媒體行為
有零件是 在本地通過 Class.Instance.new() 在 Class.LocalScript 中創建的。在「捕捉旗標幟」遊戲中,您會在藍隊的所有玩家上通過 LocalScript 創建和附加藍色頭盔零件。零件不會複製到服務伺服器,且不會因為你使它成為服務伺服器上的後代,例如玩家角色模型中的零件。
A 部分是從 Class.ReplicatedStorage 內的複製本,通過 ReplicatedStorageInstance:Clone() 中。Class.Tool 的巫師角色會啟動一個法術,Class.ReplicatedStorage 中包含一些 ReplicatedStorage 的對象會從 1> Class.ReplicatedStorage1> 和巫師位置的工作區上複製。零件不會複製到伺服器務伺服器,且不會因為你將它作為服務器上的一個子孫而播放,除非你將它作為服務器上的一個子孫。
A 部分是 從 Class.ReplicatedStorage 重新生成 到工作區 via a ReplicatedStorage巫師帽 存放在 LocalScript 中。當玩家選擇加入巫師團隊時,帽子會移動到他們的角色模型中,通過 Class.LocalScript 來。零件從伺服器來自,因此仍然可以串流,因為它是從伺服器複製到 ReplicatedStorage 。避免此模式,因為這會導致客戶端和伺服器之間的延遲,並且零件可能會串流;相反, 複製零件 零件。

模型行為

如果您將ModelStreamingBehavior設置為 改進 ,引擎可能會在適當的時間發射預設模型,這可能會導致客戶端在內存上的1>剩餘1>,從而降低4>實例4>的需要更新屬性。

The Properties window with the ModelStreamingBehavior property set to Improved.

改進 模型傳輸行為時,由於是否發生 空間 (包含 Class.BasePart 後代) 或 1>非空間1> (包含 4> Class.BasePart4> 後代) 的模型來決定是否發生非 7> 空間7> 行為。

  • 空間模型只會在其最後剩下的 BasePart 兒女兒孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫孫
  • 非空間模型只會在祖先輸出時輸出,與傳統的串流行為相同。

組合體和機制

當至少一個部分在 裝配 資格時,所有裝配的零件也會資格。但是,在裝配中,所有零件的所有部分都會流串流。在流動中,所

注意,有 錨定 零件的齒輪裝配件會與沒有錨定零件的裝配件處理得稍微不同:

裝配結構流媒體行為
僅限未錨定零件整個裝配是作為原子單位傳送。
錨定 root 零件只有需要連接流動零件到根零件的零件、附件和限制方式,才會一起流動。

延遲時間

在服務器上建立零件和在客戶端複製時可能有一個輕微延遲的~10毫秒。在下列兩個場景中,您可能需要使用 WaitForChild() 和其他技術,而不是假設事件和屬性更新總是在相同的時間發生。

場景範例流媒體行為
一個 LocalScript 會在伺服器上創建零件。一個玩家啟動本地 Tool 以生成一個零件,供所有玩家在伺服器上看到並與其互動的零件。當遠端功能返回客戶端時,零件可能尚未存在,即使零件位於客戶端焦點附近並且在流媒體區域內。
有零件在伺服器上的 ScriptRemoteEvent 通過發射到客戶端。當玩家加入警察團隊時,會有一個名為 ServerStorage 的"警察徽章"部分存在於玩家的角色模型中。一個名為 RemoteEvent 的"警察徽章"會被發射至該玩家的客戶端,以更新本地 UI 元素。雖然客戶端接收事件信號,但沒有保證零件已傳送至該客戶端。
一個零件與服務器上的隱形區域發生衝突,並且在客戶端上觸發一個 RemoteEvent一名玩家踢足球進球,觸發「進球得分」事件。靠近目標的其他玩家可能會在球被傳送到他們之前看到「已入球」事件。

流媒體屬性

下列控制程式會對您的體驗添加程式碼。 所有此類程式碼都是 非腳本 並且必須在 Studio 的 工作區 對象上設定。

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

模型流式行為

控制玩家加入時是否重複 預設 ( 非原子 ) 模型,或在需要時僅傳送。如果此屬性設為 改良 , 1> Class.Workspace1> 中的模型僅在需要時傳送給客戶,可能會導致加入時間延遲。參見 4>技術行為

Streaming 集成模式

如果玩家移動到世界的某個區域,而未被直播,則可能會發生意外行為。播放整合功能提供一種方法來避免這些可能導致問題的情況。請參閱Enum.StreamingIntegrityMode文件以取得更多資訊。

Streaming最小範圍

StreamingMinRadius 屬性表示玩家角色 (或 Class.Player.ReplicationFocus|ReplicationFocus ) 周圍的範圍,在哪些情況下流量最高。 請注意增加預設值時,因為這會需要更多記憶體和更多服務器帶寬,而且這些元素的其他部分將受到影響。

流媒體目標範圍

StreamingTargetRadius 屬性控制最大距離從玩家角色 (或 Class.Player.ReplicationFocus|Class.Player.ReplicationFocus) 遠處的流媒體。注意:引擎允許在目標範圍外保留以前載入的實例,並且允許在內存中保留以前載入的實例。

一個更小的 StreamingTargetRadius 減少伺服器的工作載量,因為伺服器不會在額外的實例以上於設定值之外流量。但目標範圍也是玩家能夠看到您的體驗完整細節的最大距離,因此您應該選擇一個能夠在這些之間建立良好平衡的值。

StreamOut 行為

StreamOutBehavior 屬性設置 串流退出 行為,以下是其中一個值:

設置流媒體行為
預設 預設行為,目前與 LowMemory 相同。
低記憶體 客戶只會在內存不足的情況下輸出零件,並且在最小範圍內移除 3D 內容。
機會主義者 超出 StreamingTargetRadius 區域的區域可以在客戶端即使沒有記憶體壓力時移除。在此模式中,客戶端永遠不會移除離目標範圍更近的實例,除非在低記憶體情況下。

模型間流媒體控制

全球地區,ModelStreamingBehavior 屬性讓您控制模型如何在加入時播放。此外,為了避免與串流在模型基礎上發生問題並最小限度地使用 WaitForChild() ,您可以自訂 Class.Model|Models

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

預設值/非原子

Model 設為 預設值非原子化 時,流媒體行為會因為是否設為 1> 模型流媒體行為1> 是否設為 4> 預設值4> ( 7> 繼承值7> ) 或 9> 改進值9> 而變化。

模型流動行為技術行為
預設 ( 繼承 )當玩家加入時,模型會重複。這可能會導致在載入時發送的更多實例、在記憶體中儲存的更多實例和對模型的後代進行更多複雜性的需求。例如,一個單獨的 LocalScript 將需要使用 WaitForChild() 在模型的
改善了 該模型只會在必要時發送,可能會導致加入時間。

參閱技術行為了解更多詳情。

原子

如果 Model 變更為 Atomic ,所有的後代都會一起串流在模型中,當一個後代 BasePart 資格時

原子模型只會在所有的後代零件資格流出時輸出,這個時候整個模型將會一起輸出。 如果只有某些零件的原子模型會一般流出,整個模型和它們的後代將會留在客戶端。

A diagram showing Atomic model streaming along with children.
本地指令碼

-- 原子模型在載入時不存在;請使用 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.
本地指令碼

-- 永久模型在載入時不存在;請使用 WaitForChild()
local model = workspace:WaitForChild("Model")
-- 下游零件以模型為基礎並立即可以存取
local meshPart = model.MeshPart
local part = model.Part

持續耦合玩家

將模型設置為 PersistentPerPlayer 與使用 Persistent 為玩家添加的玩家相同。對於其他玩家,行為與使用 Model:AddPersistentPlayer() 的玩家相同。您可以透過 1> Class.Model:RemovePersistentPlayer()1> 來從玩家手中恢復模型。

要求區域直播

如果您將一名玩家角色的 CFrame 設置為區域,而該區域尚未載入,則會發生 串流暫停,如果啟用。 如果您知道角色將移動到特定區域,您可以呼叫 Player:RequestStreamAroundAsync() 來要求服務器將區域發送到該區域。

以下指令顯示如何發射客戶端到伺服器的遠程事件來傳輸玩家在一個空間內移動,並在移動角色到新的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
-- 當客戶端啟動遠端事件時,呼叫傳輸功能
teleportEvent.OnServerEvent:Connect(teleportPlayer)
本地腳本-發射遠端事件

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local teleportTarget = Vector3.new(50, 2, 120)
-- 發射遠端事件
teleportEvent:FireServer(teleportTarget)

偵測實例串流

在某些情況下,需要偵測到一個對象是否輸入或輸出,並且對該事件進行反應。一個有用的 streaming 偵測模式是如下:

  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 在目前直播區域外不會預設為可見。但是,您可以指訓引擎以更低解析度「imposter」 網格對於不在客戶端通過每個模型的 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.
低解析度「imposter」網格
模型設定流媒體行為
StreamingMesh 啟用遙測網格的生成,以便在客戶端不存在時顯示。
關閉 / 自動 該模型在流媒體範圍外消失。

使用捣乱者網格時,注意以追蹤中:

  • 欺詐者網格是設計在 1024 距離離開相機 或更遠處。如果您將 StreamingTargetRadius 減少至 256 或更小,欺詐者網格可能無法對模型進行視覺接受。
  • 如果模型 其子模型是設置為 StreamingMesh ,只有上層祖先模型才會顯示為偽裝網格,將所有 геометリ包含在祖先和其子模型之下。為了獲得更好的履約,建議您使用 Disabled 對子模型。
  • 不支援材質;欺詐網格會以滑滑網格的形式顯示。
  • 雖然 Model 不是完全串流在,但詐欺網格會在模型的個別零件上 renders 而不是 renders 整個零件. 一旦所有零件都被串流在,它們會 renders 和詐欺網格被忽略.
  • 欺詐網格沒有物理意義,並且作為 射線投射衝突偵測 和物理模擬的非存在。
  • 在 Studio 中編輯模型,例如添加/刪除/重新位置子零件或重設顏色,會自動更新代表網格。