實例串流

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

遊戲中 實例串流 允許 Roblox 引擎以動態方式加載和卸載 Workspace 中的 3D 內容及相關實例。這可以在多方面改善玩家的整體體驗,包括:

  • 更快的加入時間
    — 玩家可以在世界的一個部分開始遊玩,同時更多的世界在背景中加載。
  • 記憶體效率
    — 遊戲可以在內存較少的設備上運行,因為內容是動態串流進出。更具沉浸感和詳細的世界可以在更廣泛的設備上運行。
  • 性能改進
    — 更好的幀率和性能,因為伺服器可以花更少的時間和帶寬來同步世界和其中的玩家之間的變更。客戶端花更少的時間更新目前與玩家不相關的實例。
  • 細節級別
    — 當配置時,遠處的模型、平台角色和地形即使在不串流至客戶端的情況下仍然可見,保持遊戲的優化而不完全犧牲背景視覺效果。

實例串流通過 Workspace.StreamingEnabled 屬性來控制,對於在 Studio 中創建的新地方預設啟用。此屬性不能在腳本中設置。

屬性窗口,啟用了 StreamingEnabled 屬性。

技術行為

範圍

串流邏輯和功能僅適用於 Workspace 的子實例,而存儲在其他容器中的實例,如 ReplicatedStorageReplicatedFirst 不符合串流條件。例如,將 原子 模型放在 ReplicatedStorage 下並不能保證原子複製。

串流進

當玩家加入啟用了實例串流的遊戲時:

  1. Workspace 中的實例被複製到客戶端 不包括 以下內容:

    Workspace.ModelStreamingBehavior 設為 Improved 時,設置為 Nonatomic (預設) 的 Models

    上述實例的子實例

  2. 在遊玩過程中,伺服器可以根據遊戲的 串流屬性、玩家的位置、客戶端設備性能以及其他條件將上述延遲類別的實例串流到客戶端。

串流出

在遊玩過程中,客戶端可以根據 Workspace.StreamOutBehavior 設定將 BaseParts 的區域從玩家的 Workspace 中移除。該過程始於離 複製焦點 最遠的區域,並根據需要向內移動。位於 Workspace.StreamingMinRadius 範圍內的區域永遠不會串流出。

請注意,沒有 BasePart 子實例的 Model,如僅作為非 BasePart 實例(如腳本)的 "容器",免於 串流出 除非 它作為 BasePart 的子實例。

組件

物理 組件 會作為完整單位串流 ,包括其相關的 ConstraintsAttachments,幫助確保客戶端上的物理更新一致。唯一的例外是當組件處於 固定 狀態時,在這種情況下,僅在串流半徑內的 BaseParts 會與其相關的 ConstraintsAttachments 一起串流進來。

組件不會在所有的 BaseParts 都符合串流出條件之前串流

串流屬性

以下屬性控制實例串流如何應用於你的遊戲。所有這些屬性都是 不可腳本化 的,必須在 Studio 中的 Workspace 對象上設置。

屬性描述
EnableSLIMAvatars控制是否為遊戲中的角色生成 SLIM 模型。當啟用時,角色的渲染將使用 SLIM,與將 Model.LevelOfDetail 設為 SLIM 的其他模型的工作方式相同。
ModelStreamingBehavior控制 Nonatomic (預設) 模型的串流進出行為。

推薦
使用 Improved 來啟用對具有 BasePart 子實例的 Models 的最高效串流。
StreamingIntegrityMode如果玩家移動進入尚未串流至他們的世界區域,遊戲可能會表現出意外的行為。此屬性提供了一種避免這些潛在問題的方法。

推薦
使用 PauseOutsideLoadedArea 來平衡遊玩完整性,避免不必要或過於頻繁的暫停。你還可以 自定義暫停畫面
StreamingMinRadius此屬性指示在 複製焦點 周圍的半徑,實例在此區域內以最高優先級串流進行。提高預設值時應謹慎,因為這樣做將需要更多內存和伺服器帶寬,並犧牲其他組件。

推薦
使用預設值 64 來最大化引擎為低端設備縮小遊戲的能力。
StreamingTargetRadius此屬性控制從 複製焦點 開始的最大距離,實例在此距離內串流進來。請注意,引擎允許在內存允許的情況下保留在目標半徑之外之前加載的實例。

較小的 StreamingTargetRadius 減少伺服器工作負載,因為伺服器將不會在設置值之外串流額外的實例。但是,目標半徑也是玩家能夠看到你的遊戲的完整細節的最大距離,因此你應選擇一個能在這兩者之間達成良好平衡的值。

推薦
使用預設值 1024 來在高端設備上為玩家的可見性和合理的內存佔用之間取得良好平衡。
StreamOutBehavior此屬性根據 Enum.StreamOutBehavior 的值設置 串流出 行為。如果設為 LowMemory (預設),客戶端僅在內存不足的情況下串流出超過最小半徑的區域。如果設為 Opportunistic,則即使在沒有記憶體壓力的情況下,目標半徑之外的區域也可以在客戶端上移除(在此模式下,客戶端永遠不會移除在目標半徑內的實例,除非在內存不足的情況下)。

推薦
使用 Opportunistic 允許客戶端積極進行垃圾收集內容,顯著減少內存使用並幫助防止內存不足崩潰。

複製焦點

預設情況下,串流圍繞本地玩家角色的 PrimaryPart 進行,雖然你可以通過 Player.ReplicationFocus 指定不同的複製焦點。

你還可以通過 Player:AddReplicationFocus()Player:RemoveReplicationFocus() 添加和移除額外的複製焦點,以動態啟用遊戲中多個區域的串流。

客戶端的物理模擬(包括實施 伺服器權威 時的預測和重新模擬)僅在串流區域中發生,即使是本地創建的實例和 Persistent 實例。如果你有希望即使在角色遠離的情況下仍保持模擬的實例,則應在這些實例附近創建額外的複製焦點。

模型串流控制

為避免每個模型串流的問題並盡量減少使用 WaitForChild(),您可以通過其 ModelStreamingMode 屬自定義 Models 及其子實例的串流方式。

非原子

預設情況下,模型為 Nonatomic,根據 Workspace.ModelStreamingBehavior 設置為 Legacy (預設) 或 Improved 時進行串流進/出。

舊版

Workspace.ModelStreamingBehavior 設置為 Legacy (預設) 時,Model 容器及其 BasePart 子實例(如 Scripts)在玩家加入時會複製到客戶端。然後,當符合條件時,模型的 BasePart 子實例串流進來。

改進版

Workspace.ModelStreamingBehavior 設置為 Improved 時,模型串流行為根據模型是否包含 BasePart 子實例或不包含 BasePart 子實例而有所不同:

  • 當含有 BasePart 子實例的模型只有在 BasePart 子實例有資格串流進時才會串流 。在此情況下,模型及其符合資格的 BasePart 一同串流進來,還包括該模型的 BasePart 子實例。

    當模型的最後一個剩餘的 BasePart 串流 時,模型本身也會隨之串流出。

  • 沒有 BasePart 子實例的模型(例如僅用作非 BasePart 實例(如腳本)的 "容器")會在玩家加入後不久便會複製到客戶端。這類模型 免除 串流出 除非它成為 BasePart 的子實例。

原子

如果 Model 設置為 Atomic,則當一個子代 BasePart 符合串流進條件時,所有初始子代會一同串流進來。因此,需要訪問實例 內部 的客戶端腳本需要在模型本身上使用 WaitForChild(),但不需要在子代 MeshPartPart 上,因為它們與模型一起發送。

只有當所有子實例都符合串流出條件時,原子模型才會串流出,此時整個模型會一同串流出。

顯示原子模型串流及其子級的圖示。

持久

Persistent 模型不受正常串流進或串流出的約束。它們會在玩家加入後不久作為完整的原子單位發送,並在 Workspace.PersistentLoaded 事件觸發之前發送。持久模型及其子實例不會串流出,但是為了安全地處理在客戶端腳本中的串流,您應等待 PersistentLoaded 事件觸發。

顯示持久模型串流及其子級的圖示。

每玩家持久

設置為 PersistentPerPlayer 的模型對使用 Model:AddPersistentPlayer() 添加的玩家的行為與 Persistent 相同。對於其他玩家,其行為與 Atomic 相同。您可以通過 Model:RemovePersistentPlayer() 將模型恢復為玩家持久性。

暫停畫面自定義

假設 Workspace.StreamingIntegrityMode 設置為推薦的 PauseOutsideLoadedArea,當玩家移動進入尚未串流至他們的世界區域時,遊戲會暫停。在這些情況下,Player.GameplayPaused 屬性指示玩家的當前暫停狀態,可以與 GetPropertyChangedSignal() 連接一起使用來顯示或隱藏自定義 GUI。

LocalScript

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)

運行時調試

該引擎包括多個可在客戶端使用鍵盤快捷鍵啟用的螢幕調試面板。要訪問串流調試信息:

  1. 通過 ShiftCtrlF3(Windows)或 ShiftF3(Mac)打開 網絡摘要 調試覆蓋層。

  2. 當調試覆蓋層打開後,重複按 Shift1 以循環顯示可用的面板。第四個面板是 串流 調試視圖,顯示有用的運行時信息:

    • 活動串流設置
    • 當前可加載(串流進)區域
    • 串流行為和狀態

啟用後,顏色高亮區域將出現在 3D 視口中:

©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。