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

技術的動作
スコープ
ストリーミングロジックと機能は、Workspaceの子孫であるインスタンスにのみ適用され、ReplicatedStorageやReplicatedFirstなどの他のコンテナに格納されたインスタンスはストリーミングの対象外です。たとえば、ReplicatedStorageの下に原子モデルを配置しても、原子複製が保証されるわけではありません。
ストリームイン
プレイヤーがインスタンスストリーミングが有効なゲームに参加すると:
Workspace内のインスタンスがクライアントに複製されますが、以下は除外されます:

原子、永続、またはプレイヤーごとに永続に設定されたModels;モデルごとのストリーミング制御を参照

ModelsがWorkspace.ModelStreamingBehaviorがImprovedに設定されているときに非原子(デフォルト)に設定されている

上記のインスタンスの子孫
ゲームプレイ中、サーバーはゲームのストリーミングプロパティ、プレイヤーの位置、クライアントデバイスのパフォーマンス、およびその他の条件に基づいて、上記の保留カテゴリのインスタンスをクライアントにストリーミングする場合があります。
ストリームアウト
ゲームプレイ中、クライアントはWorkspace内のBasePartsの領域を、Workspace.StreamOutBehaviorで設定された動作に基づいてプレイヤーのWorkspaceから削除する場合があります。このプロセスは、複製焦点から最も遠い領域から始まり、必要に応じて近づいていきます。Workspace.StreamingMinRadius範囲内の領域は、決してストリームアウトしません。
BasePartの子孫を持たないModel(スクリプトなどの非BasePartインスタンスの「コンテナ」としてのみ使用されるもの)は、BasePartの子孫にされない限り、ストリーミングアウトから免除されます。
アセンブリ
物理的なアセンブリは、関連するConstraintsおよびAttachmentsを含む完全な単位としてストリーミングインされ、クライアントでの一貫した物理更新を確保します。唯一の例外は、アセンブリが固定されている場合で、その場合はストリーミング半径内のBasePartsのみが、関連するConstraintsおよびAttachmentsと共にストリーミングされます。
アセンブリは、すべてのBasePartsがストリーミングアウトする資格があるまでストリーミングアウトしません。
ストリーミングプロパティ
以下のプロパティは、インスタンスストリーミングがゲームにどのように適用されるかを制御します。これらのプロパティはすべてスクリプト化できず、Studio内のWorkspaceオブジェクトに設定する必要があります。

| プロパティ | 説明 |
|---|---|
| EnableSLIMAvatars | ゲーム内のアバターキャラクターに対してSLIMモデルが生成されるかどうかを制御します。有効にすると、アバターは他のモデルに対してModel.LevelOfDetailをSLIMに設定するのと同じ方法でSLIMを使用してレンダリングされます。詳細についてはSLIMを参照してください。 |
| ModelStreamingBehavior | 非原子(デフォルト)モデルがどのようにストリーミングインおよびストリーミングアウトされるかを制御します。 推奨 Improvedを使用して、ModelsのBasePart子孫に対して最も効率的なストリーミングを有効にします。 |
| PredictiveStreamingMode | エンジン信号を使用して、プレイヤーがすぐに必要とする可能性のあるエリアを積極的にストリーミングする予測ストリーミングにオプトインします。たとえば、リスポーン地点やプレイヤーが最近離れた地域などです。予測は加算的で、短時間使用されないと期限切れになり、リソース制約のあるクライアントではスキップされます。 |
| StreamingIntegrityMode | プレイヤーがストリーミングされていない地域に移動すると、ゲームが意図しない方法で動作する可能性があります。このプロパティは、潜在的に問題のある状況を回避する方法を提供します。 推奨 PauseOutsideLoadedAreaを使用して、不要にまたは頻繁に一時停止することなくゲームプレイの整合性をバランスさせます。また、ポーズ画面をカスタマイズすることもできます。 |
| StreamingMinRadius | このプロパティは、インスタンスが最優先でストリーミングインされる複製焦点の周りの半径を示します。デフォルトを増やす際には注意が必要で、そうすることで他のコンポーネントのコストをかけて、より多くのメモリとサーバー帯域幅が必要になります。 推奨 エンジンが低スペックデバイス向けにゲームを最大限にスケールダウンできるように、デフォルトの64を使用します。 |
| StreamingTargetRadius | このプロパティは、インスタンスがストリーミングインされる複製焦点からの最大距離を制御します。エンジンは、メモリが許す限り、ターゲット半径を超えて以前にロードされたインスタンスを保持することが許可されています。 小さいStreamingTargetRadiusはサーバーの作業負荷を軽減します。サーバーは設定された値を超えて追加のインスタンスをストリーミングインしません。ただし、ターゲット半径はプレイヤーがゲームの完全な詳細を見ることができる最大距離でもあるため、これらの間で良いバランスを取る値を選択する必要があります。 推奨 高スペックデバイスのプレイヤーの視認性と合理的なメモリフットプリントの間で良いバランスを取るために、デフォルトの1024を使用します。 |
| StreamOutBehavior | このプロパティは、Enum.StreamOutBehaviorの値に応じてストリーミングアウトの動作を設定します。LowMemory(デフォルト)に設定されている場合、クライアントは低メモリ状況で最小半径を超える領域のみをストリーミングアウトします。Opportunisticに設定されている場合、メモリ圧力がない場合でも、StreamingTargetRadiusを超える領域をクライアントで削除できます(このモードでは、クライアントはターゲット半径内のインスタンスを削除することはありません。低メモリ状況を除く)。 推奨 クライアントがコンテンツを積極的にガーベジコレクトできるように、Opportunisticを使用して、メモリ使用量を大幅に削減し、メモリ不足のクラッシュを防ぎます。 |
複製焦点
デフォルトでは、ストリーミングはローカルプレイヤーのキャラクターのPrimaryPartの周りで発生しますが、Player.ReplicationFocusを通じて異なる複製焦点を指定することもできます。
Player:AddReplicationFocus()およびPlayer:RemoveReplicationFocus()を使用して、ゲームの複数のエリアでストリーミングを動的に有効にするために、追加の複製焦点を追加および削除することもできます。
クライアント側の物理シミュレーションは、サーバー権限が実装されている場合、予測および再シミュレーションを含め、ストリーミングされたエリア内でのみ発生します。キャラクターから遠く離れた場所でもシミュレーションを維持したいインスタンスがある場合は、それらのインスタンスの近くに追加の複製焦点を作成してください。
予測ストリーミング
予測ストリーミングは、エンジン信号を使用してプレイヤーの動きを予測し、プレイヤーがすぐに必要とする可能性のあるエリアを積極的にストリーミングするオプトイン機能です。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子孫を含むかどうかによって異なります:
原子
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を繰り返し押して利用可能なパネルをサイクルします。4番目のパネルはストリーミングデバッグビューで、役立つ実行時情報を表示します:
- アクティブなストリーミング設定
- 現在ロードされている(ストリーミングインされた)領域
- ストリーミングの動作と状態
有効にすると、3Dビューポートに色付きのハイライト領域が表示されます:
| 色 | 説明 |
|---|---|
| StreamingMinRadius未満 | |
| StreamingMinRadius以上、StreamingTargetRadius未満 | |
| StreamingTargetRadiusと等しい | |
| StreamingTargetRadiusを超える |

