ゲーム内のインスタンスストリーミングにより、RobloxエンジンはWorkspace内で3Dコンテンツおよび関連インスタンスを動的に読み込みおよびアンロードできます。これにより、プレイヤー体験がいくつかの方法で改善されます。具体的には:
- より速い参加時間— プレイヤーは、世界のある部分でプレイを開始し、他の部分がバックグラウンドで読み込まれている間にプレイできます。
- メモリ効率— コンテンツが動的に読み込まれるため、メモリの少ないデバイスでもゲームがプレイ可能になります。より没入感があり詳細な世界をさまざまなデバイスでプレイできます。
- パフォーマンスの向上— サーバーが世界とその中のプレイヤーとの間の変更を同期するのにかかる時間と帯域幅が減るため、フレームレートとパフォーマンスが向上します。クライアントは、現在プレイヤーに関連しないインスタンスの更新にかかる時間が減ります。
- 詳細レベル— 設定されている場合、遠くのモデル、プラットフォームアバター、地形は、クライアントにストリーミングされていなくても表示されたままとなり、バックグラウンドのビジュアルを全面的に犠牲にすることなくゲームを最適化します。
インスタンスストリーミングは、Workspace.StreamingEnabledプロパティを介して制御され、新しいスタジオで作成された場所ではデフォルトで有効になっています。このプロパティはスクリプト内で設定できません。

技術的動作
スコープ
ストリーミングのロジックと機能はWorkspaceの子孫であるインスタンスにのみ適用され、ReplicatedStorageやReplicatedFirstなどの他のコンテナに格納されているインスタンスはストリーミングの対象外です。たとえば、ReplicatedStorageの下にアトミックモデルを配置しても、アトミックな複製が保証されるわけではありません。
ストリームイン
プレイヤーがインスタンスストリーミングが有効なゲームに参加すると:
ゲームプレイ中、サーバーはゲームのストリーミングプロパティ、プレイヤーの位置、クライアントデバイスのパフォーマンス、およびその他の条件に基づいて、上記の遅延カテゴリのインスタンスをクライアントにストリーミングできる場合があります。
ストリームアウト
ゲームプレイ中、クライアントはWorkspace.StreamOutBehaviorで設定された動作に基づいて、プレイヤーのWorkspaceからBasePartsの領域を削除することができます。プロセスは、複製の焦点から最も遠い領域から始まり、必要に応じてより近くに移動します。Workspace.StreamingMinRadiusの範囲内にある領域は決してストリーミングアウトしません。
BasePartの子孫を持たないModel(例えば、非BasePartインスタンスの「コンテナ」としてのみ使用されるもの)は、BasePartの子孫である場合を除き、ストリーミングアウトすることは免除されます。
アセンブリ
物理アセンブリは、関連するConstraintsおよびAttachmentsを含む完全な単位としてストリーミングインされ、クライアントでの物理更新を一貫性のあるものに保ちます。唯一の例外は、アセンブリが固定されている場合であり、その場合はストリーミング半径内のBasePartsのみが、関連するConstraintsおよびAttachmentsとともにストリーミングされます。
アセンブリは、すべてのBasePartsがストリーミングアウトの対象になるまでストリーミングアウトされません。
ストリーミングプロパティ
次のプロパティは、インスタンスストリーミングがゲームに適用される方法を制御します。これらのプロパティはすべてスクリプトでは設定できず、スタジオ内のWorkspaceオブジェクトで設定する必要があります。

| プロパティ | 説明 |
|---|---|
| EnableSLIMAvatars | ゲーム内のアバターキャラクターに対して、SLIMモデルが生成されるかどうかを制御します。有効にすると、アバターは他のモデルに対してModel.LevelOfDetailをSLIMに設定した場合と同様に、SLIMを使用してレンダリングされます。 |
| ModelStreamingBehavior | 非アトミック(デフォルト)モデルがどのようにストリーミングインおよびアウトされるかを制御します。 推奨 Improvedを使用して、ModelsでBasePartの子孫を持つものに最も効率的なストリーミングを有効にします。 |
| StreamingIntegrityMode | プレイヤーがまだストリーミングされていない世界の領域に移動すると、ゲームが意図しない動作をする可能性があります。このプロパティは、それらの潜在的に問題を引き起こす状況を回避するための方法を提供します。 推奨 PauseOutsideLoadedAreaを使用して、不必要または過度に頻繁に一時停止せずにゲームプレイの整合性を保ちます。あわせて一時停止画面のカスタマイズも可能です。 |
| StreamingMinRadius | このプロパティは、インスタンスが最も高い優先度でストリーミングインされる複製の焦点の周囲の半径を示します。デフォルトを増やすと、他のコンポーネントの代わりに、より多くのメモリとサーバーバンド幅が必要になるため、注意が必要です。 推奨 デフォルトの64を使用して、エンジンがローエンドデバイス向けにゲームを最大限にスケールダウンできるようにします。 |
| StreamingTargetRadius | このプロパティは、インスタンスがストリーミングインされる最大距離を複製の焦点から制御します。エンジンは、メモリが許容される場合、ターゲット半径を超えて以前に読み込まれたインスタンスを保持することが許可されています。 小さいStreamingTargetRadiusはサーバーの作業負担を軽減します。設定値を超えて追加のインスタンスのストリーミングインは行われないためです。ただし、ターゲット半径はプレイヤーがゲームの完全な詳細を視認できる最大距離でもあるため、これらのバランスを考慮した値を選択する必要があります。 推奨 デフォルトの1024を使用して、高性能デバイスのプレイヤーに対して適切な可視化と合理的なメモリフットプリントの間で良好なバランスを確保します。 |
| StreamOutBehavior | このプロパティは、Enum.StreamOutBehaviorの値に従ったストリーミングアウト動作を設定します。LowMemory(デフォルト)に設定されている場合、クライアントはメモリ状況が低い場合にのみ最小半径を超えた領域をストリーミングアウトします。Opportunisticに設定されている場合は、メモリ圧力がない場合でも、StreamingTargetRadiusを超えた領域はクライアントで削除できます(このモードでは、クライアントはターゲット半径内のインスタンスを削除しません。低メモリ状況を除く)。 推奨 Opportunisticを使用して、クライアントがコンテンツの積極的なガーベジコレクションを行えるようにし、メモリ使用量を大幅に削減し、メモリ不足によるクラッシュを防ぎます。 |
複製の焦点
デフォルトでは、ストリーミングはローカルプレイヤーのキャラクターのPrimaryPartの周囲で行われますが、Player.ReplicationFocusを介して異なる複製の焦点を指定できます。
Player:AddReplicationFocus()およびPlayer:RemoveReplicationFocus()を使用して、ゲームの複数の領域で動的にストリーミングを有効にするために、追加の複製焦点を追加または削除することもできます。
クライアント側の物理シミュレーションは、サーバー権限が実装されている際の予測および再シミュレーションを含め、ストリーミングされた領域内でのみ発生します。キャラクターから遠く離れている場合でもシミュレーションを続けたいインスタンスがある場合は、それらのインスタンスの近くに追加の複製焦点を作成してください。
モデルストリーミング制御
モデルごとのストリーミング関連の問題を避け、WaitForChild()の使用を最小限に抑えるために、Modelsおよびその子孫がどのようにストリーミングされるかを、ModelStreamingModeプロパティを介してカスタマイズできます。
非アトミック
デフォルトでは、モデルはNonatomicであり、Workspace.ModelStreamingBehaviorがLegacy(デフォルト)またはImprovedに設定されているかどうかに基づいてストリーミングイン/アウトされます。
レガシー
Workspace.ModelStreamingBehaviorがLegacy(デフォルト)に設定されている場合、Modelコンテナおよびその非BasePart子孫(たとえばScriptsなど)は、プレイヤーが参加するとクライアントに複製されます。その後、モデルのBasePart子孫がストリーミングインされる資格が生じます。

改善された
Workspace.ModelStreamingBehaviorがImprovedに設定されている場合、モデルのストリーミング動作は、モデルが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を表示または非表示にすることができます。
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)
ランタイムデバッグ
エンジンには、クライアントで有効にすることで表示できる複数の画面デバッグパネルがあります。ストリーミングのデバッグ情報にアクセスするには:
ShiftCtrlF3(Windows)またはShift⌘F3(Mac)のキーを使用してネットワークサマリーデバッグオーバーレイを開きます。
デバッグオーバーレイが開いたら、Shift1を繰り返し押して利用可能なパネルをサイクリングします。4番目のパネルがストリーミングデバッグビューで、実行時の有用な情報が表示されます:
- アクティブなストリーミング設定
- 現在読み込まれている(ストリーミングインされた)領域
- ストリーミングの動作と状態
有効になると、3Dビューポートに色付きのハイライト領域が表示されます:
| 色 | 説明 |
|---|---|
| StreamingMinRadiusより小さい | |
| StreamingMinRadius以上StreamingTargetRadius未満 | |
| StreamingTargetRadiusに等しい | |
| StreamingTargetRadiusより大きい |


