实例流

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

游戏中的 实例流 允许 Roblox 引擎动态加载和卸载 Workspace 中的 3D 内容及相关实例。这可以通过以下几种方式改善整体玩家体验:

  • 更快的加入时间
    — 玩家可以在世界的一个部分开始游戏,同时背景中的其他区域正在加载。
  • 内存效率
    — 游戏可以在内存较少的设备上进行,因为内容是动态流入和流出的。更身临其境和详细的世界可以在更广泛的设备上进行游玩。
  • 性能提升
    — 更好的帧率和性能,因为服务器可以在世界和其中的玩家之间花费更少的时间和带宽来同步更改。客户端花费更少的时间来更新对于玩家当前不相关的实例。
  • 细节层次
    — 在配置时,即使远处模型、平台化身和地形未被传送到客户端,它们仍然可见,从而保持游戏优化,同时不会完全牺牲背景视觉效果。

实例流通过 Workspace.StreamingEnabled 属性进行控制,对于在 Studio 中创建的新场景默认启用。此属性不能在脚本中设置。

属性窗口中启用的 StreamingEnabled 属性。

技术行为

范围

流逻辑和功能仅适用于 Workspace 的后代实例,而存储在 ReplicatedStorageReplicatedFirst 等其他容器中的实例不适合流。例如,将一个 原子 模型放在 ReplicatedStorage 下并不能保证原子的复制。

流入

当玩家加入具有实例流的游戏时:

  1. Workspace 中的实例会复制到客户端 不包括 以下内容:

    ModelsWorkspace.ModelStreamingBehavior 设置为 Improved 时设置为 非原子 (默认)。

    上述实例的后代

  2. 在游戏过程中,服务器可以基于游戏的 流属性、玩家位置、客户端设备性能和其他条件,流入上述延迟类别的实例到客户端。

流出

在游戏过程中,客户端可以基于 Workspace.StreamOutBehavior 设置的行为,从玩家的 Workspace 中移除 BaseParts 区域。该过程始于距离 复制焦点 最远的区域,根据需要向内移动。位于 Workspace.StreamingMinRadius 范围内的区域将始终保留。

请注意,包含无 BasePart 子代的 Model(例如,仅用作非 BasePart 实例(如脚本)的 "容器")的实例在 除非 它成为 BasePart 的后代,否则是 豁免 出流的。

组件

实际的 组件 作为完整的单元流 ,包括它们相关的 ConstraintsAttachments,有助于确保客户端上的物理更新一致。唯一的例外是,当组件被 锚定 时,此时仅在流区域内的 BaseParts 及其相关的 ConstraintsAttachments 会被流入。

在所有的 BaseParts 都符合出流条件之前,组件不会流

流属性

以下属性控制实例流如何应用于您的游戏。所有这些属性都是 不可脚本化 的,必须在 Studio 中设置在 Workspace 对象上。

属性描述
EnableSLIMAvatars控制游戏中是否为头像角色生成 SLIM 模型。当启用时,头像以与将 Model.LevelOfDetail 设置为 SLIM 相同的方式进行渲染。
ModelStreamingBehavior控制 非原子 (默认)模型如何流入和流出。

推荐使用
使用 Improved 启用具有 BasePart 子代的 Models 的最高效流。
StreamingIntegrityMode如果玩家移动到尚未流向他们的世界区域,游戏可能会表现出意外的方式。此属性提供了一种避免这些潜在问题情况的方法。

推荐使用
使用 PauseOutsideLoadedArea 以便在不必要或过于频繁地暂停的情况下平衡游戏的完整性。您还可以 自定义暂停屏幕
StreamingMinRadius此属性表示围绕 复制焦点 的半径,在该半径内实例以最高优先级流入。增加默认值时需谨慎,因为这样做会要求更多内存和更多服务器带宽,从而牺牲其他组件。

推荐使用
使用默认值 64 来最大化引擎为低端设备缩小游戏的能力。
StreamingTargetRadius该属性控制实例流入的最大距离,超出 复制焦点。请注意,引擎允许在目标半径之外保留以前加载的实例,前提是内存允许。

较小的 StreamingTargetRadius 减少了服务器的工作负载,因为服务器不会在设置值之外流入额外的实例。然而,目标半径也是玩家能够看到您游戏的完整细节的最大距离,因此您应该选择一个值,在这两者之间取得良好平衡。

推荐使用
使用默认值 1024 在高端设备上为玩家提供良好可见性与合理的内存占用之间取得良好的平衡。
StreamOutBehavior该属性根据 Enum.StreamOutBehavior 设置 流出 的行为。如果设置为 LowMemory (默认),客户端仅在低内存情况下流出超出最小半径的区域。如果设置为 Opportunistic,客户端可以在没有内存压力的情况下移除超出 StreamingTargetRadius 的区域(在这种模式下,客户端在低内存情况下不取消实例,仅在目标半径内的实例)。

推荐使用
使用 Opportunistic 允许客户端积极进行垃圾回收,显著减少内存使用,并帮助防止内存不足崩溃。

复制焦点

默认情况下,流动发生在本地玩家角色的 PrimaryPart 周围,尽管您可以通过 Player.ReplicationFocus 指定不同的复制焦点。

您还可以通过 Player:AddReplicationFocus()Player:RemoveReplicationFocus() 添加和移除其他复制焦点,以动态启用游戏多个区域的流。

客户端物理模拟(包括在实现 服务器权限 时的预测和重新模拟)发生在流区域内,即使是对于本地创建的实例和 Persistent 实例。如果您希望某些实例即使距离角色较远也能继续模拟,请在那些实例附近创建额外的复制焦点。

模型流控制

为了避免在每个模型基础上流动的问题,并最小化使用 WaitForChild(),您可以通过 Models 及其子代通过其 ModelStreamingMode 属性自定义流动。

非原子

默认情况下,模型是 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 是我们在美国及其他国家或地区的注册与未注册商标。