インスタンスストリーム

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

インエクスペリエンスの インスタンスストリーミング は、Roblox エンジンが世界の地域で 3D コンテンツと関連するインスタンスを動的に読み込み、削除することを可能にします。たとえば、次のように、全体のプレイヤーエクスペリエンスをいくつかの方法で向上できます:

  • より速い参加時間 — プレイヤーは、ワールドの一部でプレイを開始でき、背景でより多くのワールドがロードされます。
  • メモリ効率 — コンテンツが動的にストリームされるため、メモリが少ないデバイスでもエクスペリエンスを再生できます。より没入感のある詳細な世界は、より広いデバイスの範囲でプレイできます。
  • パフォーマンスの向上 — サーバーが世界とその中のプレイヤー間の変更を同期する時間と帯域を削減できるため、フレームレートとパフォーマンスが向上します。クライアントは、現在プレイヤーに関連していないインスタンスの更新に少ない履行間を費やします。
  • 詳細レベル — クライアントにストリーミングされない遠隔モデルと地形は、背景ビジュアルを完全に犠牲にすることなく、経験を最適化し続けます。

ストリーミングを有効化

インスタンスストリーミングは、Studio の StreamingEnabled プロパティの ワークスペース オブジェクトを介して有効になっています。このプロパティはスクリプトで設定できません。ストリーミングは、Studio で作成された新しい場所にデフォルトで有効になっています。

The Properties window with the StreamingEnabled property enabled.

有効になったら、次のベストプラクティスに従うことをお勧めします:

  • クライアントは通常、ローカルで全体の Workspace を利用できませんので、インスタンスが存在するかどうかを確認するには、適切なツール/APIを使用してください。例えば、LocalScript でアクセスしようとする前に。たとえば、モデルストリーミングコントロールインスタンスストリーミングを検出、または存在しないオブジェクトにWaitForChild()するなど。
  • 3D コンテンツの配置を Workspace の外に最小限に抑えます。ReplicatedStorage または ReplicatedFirst のようなコンテナ内のコンテンツは、ストリーミングに不適格であり、ジョイン時間とメモリ使用量に悪影響を及ぼす可能性があります。
  • プレイヤーのキャラクターを設定の CFrame で移動する場合、サーバー側の Script から行い、ストリーミングリクエスト を使用して、新しい場所の周りのデータをより迅速にロードします。
  • プレイヤーの ReplicationFocus を手動で設定するには、Player.Character を使用しない経験など、ユニークな状況でのみ設定します。これらの場合、プレイヤーが制御するオブジェクト(s)の近くに焦点があることを確認して、プレイヤーのインタラクションポイントの周りでコンテンツが継続してストリーミングされるようにします。

技術動作

ストリーム中

デフォルトでは、プレイヤーがインスタンスストリーミングを有効にしたエクスペリエンスに参加すると、 のインスタンスがクライアントにレプリケートされ、フォロー中のものを除きます:

その後、ゲームプレイ中、サーバーは必要なインスタンスをクライアントにストリーミングする可能性があります。必要に応じて。

Diagram showing when various instances and their descendants in the Workspace stream in.
1 地形は、エクスペリエンスがロードされるとクライアントにインスタンスがレプリケートされますが、地形領域は必要なときにのみストリーミングされます

モデルの動作

モデルは、アトミック ストリームを特別なルールに従って非デフォルトの振る舞いに設定し、モデルストリーミングコントロール で説明されたように。ただし、デフォルト (非アトミック) モデルは、モデルストリーミングビーコンデフォルト ( レガシー ) または 改善 に設定されているかどうかによって異なる方法で送信されます。

The Properties window with the ModelStreamingBehavior property set to Default.

モデルストリーミングビーコンデフォルト / レガシー に設定されていると、Model コンテナとその非空間の子孫(例: Scripts )が、プレイヤーが参加するとクライアントにレプリケートします。次に、資格があるとき、モデルの BasePart 子孫がストリームに流れます。

Diagram showing default model stream in behavior.

出力ストリーム

ゲームプレイ中、クライアントは Workspace プレイヤーの領域とその内容の BaseParts をストリームアウト (StreamOutBehavior によって設定された動作に基づいて) から削除することができます。プロセスは、プレイヤーのキャラクターから最も遠い領域から開始し(または ReplicationFocus )、必要に応じて近づきます。StreamingMinRadius 範囲内の領域は決してストリーミングされません。

インスタンスがストリームアウトすると、nil に親属して、既存の Luau 状態が再接続するようになります。結果として、ChildRemoved または DescendantRemoving のような削除シグナルが、 または 祖先 に発射しますが、インスタンス自体は、Instance:Destroy() コールと同じように破壊されません。

ストリームアウトをさらに予測するには、次のシナリオを検討してください:

シナリオストリーミング行動
パーツは 作成 ローカルで通して Instance.new()LocalScript で作成されました。「フラグをキャプチャ」ゲームでは、LocalScript を介してブルーチームのすべてのプレイヤーにブルーヘルメットパーツを作成し、付属します。パーツはサーバーにレプリケートされず、 を除いて サーバー内のパーツの子孫にしない限り、ストリーミングされません。例えば、プレイヤーのキャラクタモデル内のパーツです。
パーツは クローンされている ローカルから ReplicatedStorage を通じて Instance:Clone()LocalScript で複製されています。ウィザードキャラクターは、Tool を有効にして、複数の特殊効果を含むオブジェクトを ReplicatedStorage からクローンし、ウィザードの位置のワークスペースに親属させます。パーツはサーバーにレプリケートされず、 を除いて サーバー上に存在するパーツの子孫にしない限り、ストリーミングされません。
パーツは 復元された から ReplicatedStorage を通じてワークスペースに LocalScript し、「魔法使いの帽子」は ReplicatedStorage に保存されます。プレイヤーが魔法使いのチームでプレイすることを選択すると、帽子は LocalScript を介して彼らのキャラクターモデルに移動します。パーツは、サーバーから来て ReplicatedStorage にレプリケートされたため、ストリーミングに資格があり続けます。このパターンを避けてください、クライアントとサーバーの間で非同期が発生し、パーツが流出する可能性があります。代わりに、 パーツをクローン してください。

モデルの動作

モデルストリーミング動作 を 改善 に設定すると、エンジンはストリーミングできるときに デフォルト ( アトミックでない ) モデルをストリームアウトする可能性があり、クライアントのメモリを解放し、プロパティアップデートが必要なインスタンスを減少する可能性があります。

The Properties window with the ModelStreamingBehavior property set to Improved.

改善されたモデルストリーミング動作の下で、 デフォルト ( 非アトミック )モデルからストリーミングアウトは、モデルが 空間 (含まれる子孫が )か非空間(子孫が含まれない)かどうかに基づいています。

  • 空間モデルは、最後の残りの BasePart 子孫が完全にストリームアウトするときだけ、モデルの空間部分の一部がプレイヤー/レプリケーション焦点に近いか、遠くにある可能性があるため、完全にストリームアウトします。
  • 非空間モデルは、祖先がストリームアウトするときだけストリームアウトし、レガシーストリームアウト動作と同等です。

アセンブリとメカニズム

少なくとも 1 部分の アセンブリ がストリーミングに適しているとき、アセンブリのすべての部分がストリーミングされます。しかし、アセンブリは、パーツのすべてがストリーミング可能になるまで、出力をストリーミングしません。ストリーミング中、ConstraintsAttachmentsBaseParts から下降し、原子または永続的なModels もストリームし、クライアントで一貫した物理アップデートを確保するのに役立ちます。 アンカー付き パーツを含むアセンブリは、アンカー付きパーツのみのアセンブリとは少し異なる扱いを受けます:

アセンブリの構成ストリーミング行動
未固定のパーツのみ全体のアセンブリがアトミックユニットとして送信されます。
固定された ルートパーツストリームされたパーツをルートパーツにリンクするために必要なパーツ、付属物、および制約のみが一緒にストリームされます。

タイミング遅延

サーバー上でパーツが作成されてから、クライアントにレプリケートされるまでの遅延が ~10 ミリ秒程度ある可能性があります。次の各シナリオでは、イベントとプロパティの更新が常にパートストリーミングと同時に発生すると仮定せずに、WaitForChild() や他の技術を使用する必要があるかもしれません。

シナリオストリーミング行動
A LocalScript は、サーバーに RemoteFunction を呼び出してパーツを作成するようにします。プレイヤーがローカルで Tool を有効にして、すべてのプレイヤーがサーバー上のパーツを表示して交流できるようにします。リモート関数がクライアントに戻ったとき、パーツはまだ存在していないかもしれませんが、パーツはクライアントの焦点に近く、ストリームされた領域内にあります。
パーツは、Script を介してサーバー上のキャラクターモデルに追加され、RemoteEvent がクライアントに発射されます。プレイヤーが警察チームに参加すると、ServerStorage に保存された「警察バッジ」の部分がクローンされ、プレイヤーのキャラクターモデルに付属します。A RemoteEvent はそのプレイヤーのクライアントによって発射され、ローカル UI 要素を更新するために受信されます。クライアントがイベントシグナルを受信しても、パーツがすでにそのクライアントにストリーミングされた保証はありません。
パーツがサーバー上の見えない領域と衝突し、クライアント上で RemoteEvent をトリガーします。プレイヤーがサッカーボールをゴールに蹴り、「ゴール得点」イベントをトリガーします。目標に近い他のプレイヤーは、ボールが彼らにストリーミングされる前に「ゴールを決めた」イベントを見る可能性があります。

ストリーミング属性

次のプロパティは、インスタンスストリーミングがエクスペリエンスに適用される方法を制御します。これらのプロパティはすべて スクリプトできない であり、Studio の ワークスペース オブジェクトに設定する必要があります。

The Properties window with the ModelStreamingBehavior, StreamingIntegrityMode, StreamingMidRadius, StreamingTargetRadius, and StreamOutBehavior property highlighted.

モデルストリーミングビーチ行動

プレイヤーが参加すると デフォルト ( 非アトミック ) モデルが複製されるか、必要なときにのみ送信されるかを制御します。このプロパティが 改善 に設定されている場合、Workspace のモデルは必要なときにのみクライアントに送信され、接続時間を短縮する可能性があります。詳細については、技術動作 を参照してください。

ストリーミングインテグリティモード

プレイヤーが世界の地域に移動して、それらにストリーミングされていない場合、エクスペリエンスは意図しない方法で動作する可能性があります。 ストリーミング完全性 機能は、それらの潜在的に問題のある状況を回避する方法を提供します。詳細については、Enum.StreamingIntegrityMode ドキュメントを参照してください。

ストリーミングミニラジウス

StreamingMinRadius プロパティは、プレイヤーのキャラクターの周りの半径 (または ReplicationFocus ) を指定し、インスタンスが最優先でストリーミングされる場合を示します。デフォルトを増やすときは、そうすると他のコンポーネントの負担になり、より多くのメモリとサーバーバンド幅が必要になるため注意が必要です。

ストリーミングターゲット半径

ストリーミングターゲット半径 プロパティは、ストリームが流れる最大距離からプレイヤーのキャラクター(または )を制御します。エンジンは、ターゲット半径を超えて先にロードされたインスタンスを保持することを許可されていますが、メモリが許可する限りです。

小さい ストリーミングターゲット半径 は、サーバーが設定値を超えて追加のインスタンスをストリーミングしないため、サーバーの負荷が減少します。しかし、ターゲット半径は、プレイヤーがあなたのエクスペリエンスの全体を見ることができる最大距離でもあるので、これらのバランスを保つ値を選択する必要があります。

ストリームアウトビーハビリティ

ストリームアウトビーハビリティ プロパティは、次の値のうちの 1つに従って、ストリーミングアウト 行動を設定します:

設定ストリーミング行動
デフォルト デフォルト動作、現在は LowMemory と同じです。
低メモリ クライアントは低メモリ状況でのみパーツをストリームアウトし、最小半径が存在するまで 3D コンテンツを削除する可能性があります。
機会主義的 ストリーミングターゲット半径 を超える地域は、メモリ圧がない場合でも、クライアントで削除できます。このモードでは、クライアントは低メモリ状況の場合を除き、ターゲット半径よりも近いインスタンスを決して削除しません。

モデルごとのストリーミングコン操作ロール

グローバルにおいて、モデルストリーミングビーコン プロパティでは、参加時にモデルがストリーミングされる方法を制御できます。さらに、ストリーミングに関するモデルごとの問題を避け、WaitForChild() とその子孫の使用を最小限に抑えるために、Models とその子孫がその ModelStreamingMode プロパティを通じてストリーミングする方法をカスタマイズできます。

The Properties window with the ModelStreamingMode property set to Default. The property is also highlighted.

デフォルト/非アトミック

When a Modelデフォルト または 非アトミック に設定されると、ストリーミングの動作は、ModelStreamingBehaviorデフォルト ( レガシー ) または 改善 に設定されているかどうかによって変わります。

モデルストリーミングビーチ行動技術動作
デフォルト ( レガシー )モデルは、プレイヤーが参加すると複製されます。これは、ロード中により多くのインスタンスが送信され、メモリにより多くのインスタンスが保存され、モデルの子孫にアクセスしたいスクリプトの追加複雑さにつながる可能性があります。たとえば、別の LocalScript は、モデル内の子孫 WaitForChild() 内で BasePart を使用する必要があります。
改善済み モデルは必要なときにのみ送信され、加入時間を短縮する可能性があります。

詳細については、技術動作を参照してください。

アトム的

Modelアトミック に変更された場合、すべての子孫が一緒にストリーミングされると、子孫 BasePart が有効になるとき。結果として、モデル内のインスタンスにアクセスする必要がある別の LocalScript は、モデル自体で WaitForChild() を使用する必要がありますが、モデルの下に送信されるため、子孫の MeshPart または Part は使用しません。

アトミックモデルは、すべての子モデルがストリーミングに適しているときにのみストリーミングされ、その時点で全モデルが一緒にストリーミングされます。アトミックモデルの一部のみが通常ストリームされる場合、モデル全体とその子孫はクライアントに残ります。

A diagram showing Atomic model streaming along with children.
本地スクリプト

local Workspace = game:GetService("Workspace")
-- ロード時にアトミックモデルは存在しません; WaitForChild() を使用する
local model = Workspace:WaitForChild("Model")
-- 子孫のパーツがモデルと一緒にストリームして、すぐにアクセス可能
local meshPart = model.MeshPart
local part = model.Part

永続

持続 モデルは、通常のストリーミングに服従しません。プレイヤーが参加してから Workspace.PersistentLoaded イベントが発動する直前まで、完全な原子単位として送信されます。永続モデルとその子孫は決してストリーミングされませんが、ストリーミングを安全に処理するには、親モデルで を使用するか、 イベントが発火するのを待つ必要があります。

A diagram showing Persistent model streaming along with children.
本地スクリプト

local Workspace = game:GetService("Workspace")
-- ロード時に永続モデルは存在しません; WaitForChild() を使用する
local model = Workspace:WaitForChild("Model")
-- 子孫のパーツがモデルと一緒にストリームして、すぐにアクセス可能
local meshPart = model.MeshPart
local part = model.Part

パーシスタントPerPlayer

モデルが PersistentPerPlayer に設定されると、Persistent と同じ動作をしますが、Model:AddPersistentPlayer() を使用して追加されたプレイヤーに対して。他のプレイヤーの場合、動作は アトミック と同じです。モデルをプレイヤーの持続性から戻すことができます via Model:RemovePersistentPlayer() .

エリアストリーミングをリクエスト

プレイヤーキャラクターの CFrame を現在ロードされていない領域に設定すると、ストリーミング停止 が発生します。有効にすると、停止します。キャラクターが特定の領域に移動すると分かっている場合は、Player:RequestStreamAroundAsync() を呼び出して、サーバーがその場所の周りの領域をクライアントに送信するようリクエストできます。

次のスクリプトは、クライアントからサーバーへの リモートイベント を発射して、プレイヤーを場プレース内にテレポートし、キャラクターを新しい CFrame に移動する前のストリーミングリクエストで獲得する方法を示します。

スクリプト - プレイヤーキャラクターをテレポート

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- ターゲットの場所の近くでストリーミングをリクエスト
player:RequestStreamAroundAsync(teleportTarget)
-- テレポートキャラクター
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- クライアントがリモートイベントを発動したときにテレポート関数を呼び出す
teleportEvent.OnServerEvent:Connect(teleportPlayer)
ローカルスクリプト - リモートイベントを発火

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local teleportTarget = Vector3.new(50, 2, 120)
-- リモートイベントを発射する
teleportEvent:FireServer(teleportTarget)

インスタンスストリーミングを検出

いくつかの場合、オブジェクトがストリーム化したり、そのイベントに反応したりするときを検出する必要があります。ストリーミング検出に便利なパターンは次のとおりです:

  1. インスタンスのプロパティの タグ セクション、または Studio の タグエディタ を使用して、影響を受けるすべてのオブジェクトに論理的なCollectionServiceを割り当てます。

  2. 単一の LocalScript から、タグ付きオブジェクトが GetInstanceAddedSignal()GetInstanceRemovedSignal() を通じてストリームしているかどうかを検出し、それに応じてオブジェクトを処理します。たとえば、次のコードは、タグ付きの Light オブジェクトを「フリッカー」ループに追加し、ストリームインして削除するときにストリームアウトします。

    ローカルスクリプト - CollectionService ストリーミング検出

    local CollectionService = game:GetService("CollectionService")
    local tagName = "FlickerLightSource"
    local random = Random.new()
    local flickerSources = {}
    -- 現在と新しくタグ付けされたパーツをストリーミングしているかどうかを検出
    for _, light in CollectionService:GetTagged(tagName) do
    flickerSources[light] = true
    end
    CollectionService:GetInstanceAddedSignal(tagName):Connect(function(light)
    flickerSources[light] = true
    end)
    CollectionService:GetInstanceRemovedSignal(tagName):Connect(function(light)
    flickerSources[light] = nil
    end)
    -- フリッカーループ
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.wait(0.05)
    end

一時停止画面をカスタマイズする

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)

詳細レベルモデル

ストリーミングが有効になっていると、現在ストリームされている領域の外側の Models はデフォルトで表示されません。しかし、エンジンに指示して、モデルがクライアントに存在しないモデルの低解像度の「悪意のある」メッシュをレンダリングするように指示することができます。各モデルの LevelOfDetail プロパティを通じて。

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.

実際のモデル
>

The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.

低解像度の "imposter" メッシュ
>

モデル設定ストリーミング行動
ストリームメッシュ モデルがクライアントに存在しないときに表示される悪意のあるメッシュの非同期生成を有効にします。
無効 / 自動 モデルはストリーミング範囲外に消えます。

インポスターメッシュを使用するときは、フォロー中のことに注意してください:

  • 悪意のあるメッシュは、カメラから 1024スタッド離れた場所 またはさらに見えるように設計されています。StreamingTargetRadius を 256 のような遙かに小さな値に減少させた場合、置換されたモデルには、悪意のあるメッシュが視覚的に受け入れられない可能性があります。
  • モデル その子孫モデルがすべて ストリーミングメッシュ に設定されている場合、トップレベルの祖先モデルだけが悪意のあるメッシュとしてレンダリングされ、祖先と子孫モデルのすべての幾何を祖先と子孫モデルの下に包み込みます。パフォーマンスを向上させるために、子孫モデルに 無効 を使用することをお勧めします。
  • テクスチャはサポートされていません;悪意のあるメッシュは滑らかなメッシュとしてレンダリングされます。
  • Model が完全にストリーミングされていない間、悪意のあるメッシュはモデルの個々のパーツではなく、代わりにレンダリングされます。すべての個々のパーツがストリームされた後、レンダリングされ、偽者のメッシュは無視されます。
  • 悪意のあるメッシュには物理的な意味はなく、レイキャスト衝突検出、物理シミュレーションに関して存在しないと動作します。
  • スタジオでモデルを編集すると、子部品の追加/削除/再配置や色のリセットなどが自動的に代表メッシュを更新します。