游戏内的 实例流 允许 Roblox 引擎动态加载和卸载 Workspace 中的 3D 内容及相关实例。这可以通过多种方式改善整体玩家体验,包括:
- 更快的加入时间— 玩家可以在世界的一部分开始游戏,同时更多的世界在后台加载。
- 内存效率— 游戏可以在内存较少的设备上运行,因为内容是动态流入和流出的。更具沉浸感和细节的世界可以在更广泛的设备上运行。
- 性能提升— 更好的帧率和性能,因为服务器可以花更少的时间和带宽在世界与玩家之间同步更改。客户端花更少的时间更新当前与玩家无关的实例。
- 细节层次— 当配置时,远处的模型、平台化身和地形即使在未流入客户端时仍然可见,保持游戏优化而不完全牺牲背景视觉效果。SLIM 为模型和化身提供最高保真度的细节层次。
实例流通过 Workspace.StreamingEnabled 属性进行控制,默认情况下在 Studio 中创建的新地方启用。此属性不能在脚本中设置。

技术行为
范围
流逻辑和功能仅适用于 Workspace 的后代实例,而存储在其他容器中的实例,如 ReplicatedStorage 和 ReplicatedFirst,则不适合流。例如,将一个 原子 模型放在 ReplicatedStorage 下并不能保证原子复制。
流入
当玩家加入启用实例流的游戏时:
在游戏过程中,服务器可以根据游戏的 流属性、玩家位置、客户端设备性能和其他条件,将上述延迟类别中的实例流入客户端。
流出
在游戏过程中,客户端可以根据 Workspace.StreamOutBehavior 设置,从玩家的 Workspace 中移除 BaseParts 区域。该过程从离 复制焦点 最远的区域开始,必要时向内移动。位于 Workspace.StreamingMinRadius 范围内的区域永远不会流出。
请注意,具有无 BasePart 后代的 Model(例如,仅用作非 BasePart 实例(如脚本)的“容器”)是 免于 流出的 除非 它成为 BasePart 的后代。
组件
物理 组件 作为完整单元流 入,包括其相关的 Constraints 和 Attachments,帮助确保客户端上的物理更新一致。唯一的例外是当组件被 锚定 时,此时只有流入半径内的 BaseParts 及其相关的 Constraints 和 Attachments 会被流入。
组件在所有 BaseParts 都符合流出条件之前不会流出。
流属性
以下属性控制实例流如何应用于您的游戏。所有这些属性都是 不可脚本化 的,必须在 Studio 中设置在 Workspace 对象上。

| 属性 | 描述 |
|---|---|
| EnableSLIMAvatars | 控制游戏中是否为化身角色生成 SLIM 模型。当启用时,化身使用 SLIM 渲染,方式与将 Model.LevelOfDetail 设置为 SLIM 对其他模型的效果相同。有关详细信息,请参见 SLIM。 |
| ModelStreamingBehavior | 控制 非原子(默认)模型的流入和流出方式。 推荐 使用 Improved 来启用具有 BasePart 后代的 Models 的最有效流。 |
| PredictiveStreamingMode | 选择 预测流,该流使用引擎信号主动流入玩家可能很快需要的区域,例如重生位置或玩家最近通过 CFrame 更改离开的区域。预测是累加的,如果未使用会在短时间后过期,并且在资源受限的客户端上会被跳过。 |
| StreamingIntegrityMode | 如果玩家移动到尚未流入他们的世界区域,游戏可能会以意想不到的方式表现。此属性提供了一种避免这些潜在问题的方法。 推荐 使用 PauseOutsideLoadedArea 来平衡游戏完整性,而不必不必要或过于频繁地暂停。您还可以 自定义暂停屏幕。 |
| StreamingMinRadius | 此属性指示围绕 复制焦点 的半径,在该半径内实例以最高优先级流入。增加默认值时应谨慎,因为这样做会需要更多内存和更多服务器带宽,牺牲其他组件。 推荐 使用默认值 64 来最大化引擎为低端设备缩减游戏的能力。 |
| StreamingTargetRadius | 此属性控制实例流入的最大距离,超出 复制焦点。请注意,允许引擎在目标半径之外保留先前加载的实例,前提是内存允许。 较小的 StreamingTargetRadius 减少服务器工作负载,因为服务器不会流入超出设定值的额外实例。然而,目标半径也是玩家能够看到游戏完整细节的最大距离,因此您应该选择一个在这两者之间创造良好平衡的值。 推荐 使用默认值 1024 来在高端设备上为玩家提供良好的可见性,同时保持合理的内存占用。 |
| StreamOutBehavior | 此属性根据 Enum.StreamOutBehavior 的值设置 流出 行为。如果设置为 LowMemory(默认),客户端仅在低内存情况下流出超出最小半径的区域。如果设置为 Opportunistic,则即使在没有内存压力的情况下,超出 StreamingTargetRadius 的区域也可以在客户端上被移除(在此模式下,客户端从不移除在目标半径内的实例,除非在低内存情况下)。 推荐 使用 Opportunistic 允许客户端积极进行垃圾回收,显著减少内存使用并帮助防止内存溢出崩溃。 |
复制焦点
默认情况下,流发生在本地玩家角色的 PrimaryPart 周围,尽管您可以通过 Player.ReplicationFocus 指定不同的复制焦点。
您还可以通过 Player:AddReplicationFocus() 和 Player:RemoveReplicationFocus() 添加和移除额外的复制焦点,以动态启用游戏多个区域的流。
客户端物理模拟,包括在实现 服务器权限 时的预测和重新模拟,仅在流入区域发生,即使对于本地创建的实例和 Persistent 实例也是如此。如果您有希望即使在远离角色时也保持模拟的实例,请在这些实例附近创建额外的复制焦点。
预测流
预测流是一个可选功能,使用引擎信号来预测玩家移动并主动流入玩家可能很快需要的区域。当通过将 PredictiveStreamingMode 设置为 Enabled 启用时,它可以减少流暂停和视觉突现,而无需任何代码更改。
预测流是 累加的。它在现有的 复制焦点 之外创建小的临时流焦点,流入少量额外内容,并且不会更改您的游戏逻辑或流合同。如果不需要预测,预测区域会在短时间后过期,引擎会卸载内容。引擎还会考虑客户端内存和性能,在资源受限的设备上跳过预测。
当 PredictiveStreamingMode 为 Enabled 时,以下预测功能处于活动状态:
| 功能 | 描述 |
|---|---|
| 重生预取 | 当玩家死亡时,引擎在可能的重生位置创建小的临时流焦点,以便在玩家角色出现之前,可能的重生区域开始流入,从而减少重生后立即的暂停和缺失内容。 |
| CFrame 返回优化 | 当玩家 CFrames 离开一个区域时,引擎在他们离开的地方创建一个小的临时流焦点。这有助于在玩家稍后返回时保持该区域流入,这是在建筑物、子层、商店或中心之间移动时的常见场景。 |
模型流控制
为了避免每模型流动的问题并最小化使用 WaitForChild(),您可以通过 Models 及其后代的 ModelStreamingMode 属性自定义流动方式。
非原子
默认情况下,模型为 Nonatomic,并根据 Workspace.ModelStreamingBehavior 设置为 Legacy(默认)或 Improved 来流入/流出。
遗留
当 Workspace.ModelStreamingBehavior 设置为 Legacy(默认)时,Model 容器及其 非 BasePart 后代(如 Scripts)在玩家加入时复制到客户端。然后,当符合条件时,模型的 BasePart 后代流入。

改进
当 Workspace.ModelStreamingBehavior 设置为 Improved 时,模型流动行为根据模型是否包含 BasePart 后代或 不 包含 BasePart 后代而有所不同:
原子
如果 Model 设置为 Atomic,则当一个后代 BasePart 符合流入条件时,所有初始后代会一起流入。因此,需要访问模型 内部 实例的客户端脚本需要在模型本身上使用 WaitForChild(),而不需要在后代 MeshPart 或 Part 上使用,因为它们会与模型一起发送。
原子模型仅在所有后代部件符合流出条件时流出,此时整个模型会一起流出。

持久
Persistent 模型不受正常流入或流出的限制。它们在玩家加入后不久作为完整的原子单元发送,并在 Workspace.PersistentLoaded 事件触发之前。持久模型及其后代永远不会流出,但为了安全地处理客户端脚本中的流入,您应该等待 PersistentLoaded 事件触发。

每玩家持久
设置为 PersistentPerPlayer 的模型对于使用 Model:AddPersistentPlayer() 添加的玩家表现得与 Persistent 相同。对于其他玩家,行为与 Atomic 相同。您可以通过 Model:RemovePersistentPlayer() 将模型从玩家持久性中恢复。
暂停屏幕自定义
假设 Workspace.StreamingIntegrityMode 设置为推荐的 PauseOutsideLoadedArea,如果玩家移动到尚未流入他们的世界区域,游戏将暂停。在这些情况下,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)运行时调试
引擎包括多个可以通过键盘快捷键在客户端启用的屏幕调试面板。要访问流调试信息:
- 通过 ShiftCtrlF3(Windows)或 Shift⌘F3(Mac)打开 网络摘要 调试覆盖层。
- 一旦调试覆盖层打开,反复按 Shift1 以循环浏览可用面板。第四个面板是 流 调试视图,显示有用的运行时信息:
- 活动流设置
- 当前加载(流入)区域
- 流动行为和状态
启用后,彩色高亮区域会出现在 3D 视口中:
| 颜色 | 描述 |
|---|---|
| 小于 StreamingMinRadius | |
| 大于或等于 StreamingMinRadius 且小于 StreamingTargetRadius | |
| 等于 StreamingTargetRadius | |
| 大于 StreamingTargetRadius |


