📈

【Roblox】LOD処理、ストリーミング設定について

に公開

はじめに

プレースを作りこんだりするとどうしてもModelの数が多くなり、描画の際に負荷がかかってしまいます。今回はそんなときに描画負荷を軽減することができるLOD処理の実装方法とモデルのストリーミング設定について紹介します。

Roblox バージョン: 0.661.0.6610708

LOD処理とは

LOD(Level of Detail)とは日本語で「細かさの度合い」を意味しています。
ゲームにおけるLOD処理とは、カメラからの距離に応じてモデルのポリゴン数を制御することで負荷を軽減する方法になります。カメラから近いモデルはハイポリゴンを使用し、遠いモデルはローポリゴンとするのがLODの考え方になっています。

LOD処理の実装

RobloxでのLOD処理はプロパティの設定項目を変更するだけで簡単に実装できるようになっています。

①最初にWorkspaceのプロパティにある『StreamingEnabled』にチェックを入れます。

②次にLOD処理を実装したいModelのプロパティにある『LevelOfDetail』を『StreamingMesh』に変更します。

項目 動作
Automatic デフォルトの動作。現在はDisabledと同じ動作になります。
StreamingMesh ストリーミング範囲外のモデルに対してローポリゴンモデルを使用します。
Disabled LODによるローポリゴンモデルを使用しません。

③Modelの子孫オブジェクトにあるMeshPartのプロパティで『RenderFidelity』を変更する。

項目 動作
Automatic カメラの距離によって動的に制御されます。距離が250スタッド未満、250~500スタッド、500スタッド以上でレンダリングの忠実度が変化します。
Performance パフォーマンスを優先し、可能であれば品質を維持します。
Precise カメラの距離に関係なく、最高の忠実度でレンダリングされます。

以下は実際にRenderFidelityを設定したときの画像です。
左からAutomatic⇒Performance⇒Preciseの順に設定されています。


Performanceに設定されているMeshPartはほかの設定に比べてかなりポリゴン数が抑えられて描画されているのがわかります。

④ストリーミング範囲を設定する

WorkspaceのプロパティのStreamingMinRadiusとStreamingTargetRadiusを設定します。
StreamingMinRadiusはモデルが最高優先度でストリーミングされる半径を設定できます。
StreamingTargetRadiusはモデルがストリーミングされる最大距離を設定できます。ただしロード済みのモデルはメモリが許す限り保持されます。

ストリーミング設定

ReplicationFocus

PlayerのプロパティにあるReplicationFocusはストリーミングやシミュレーションの範囲をどのパーツを基準に行うかを設定します。
ReplicationFocusプロパティはデフォルトはnilに設定されており、nilに設定されている場合はCharacterのPrimaryPartを使用します。
このプロパティを設定するにはLocalScriptではなく、Scriptを使用してサーバー上で設定する必要があります。

ModelStreamingMode

ModelのプロパティにあるModelStreamingModeはモデルがどのようにストリーミングされるかを設定できます。

項目 動作
Default 現在はNonatomicと同様の動作
Atomic モデルは子孫が必要になるとモデルとそのすべての子孫がストリーミングされます。
Persistent 常にストリーミングされます。
PersistentPerPlayer 指定したプレイヤーに常にストリーミングされます。
Nonatomic モデルは常にストリーミングされますが、子孫は部分的にストリーミングされます。

PersistentPerPlayerでプレイヤーを指定するにはAddPersistentPlayerメソッドを使用することでプレイヤーを追加できます。

StreamingIntegrityMode

WorkspaceのプロパティにあるStreamingIntegrityModeはStreamingEnabledが有効になっている際にプレイヤーがストリーミングされていない世界に移動した際の挙動を設定することができます。

項目 動作
Default 現在はDisabledと同様の動作
Disabled クライアントにストリーミングされるコンテンツの量に関係なく、シミュレーションは一時停止されることはありません。
MinimumRadiusPause コンテンツが最小半径までストリーミングされていない場合、すべてのクライアント側シミュレーションは一時停止されます。
PauseOutsideLoadedArea シミュレーションは、境界ボックスの一部がストリーム イン領域内にない場合に一時停止されます。

MinimumRadiusPauseとPauseOutsideLoadedAreaに設定されている場合、それぞれの一時停止ロジックがトリガーされたときにクライアントに既定のメッセージが表示されます。一時停止中かどうかはPlayer.GameplayPausedプロパティで確認することができます。

まとめ

  • LODを実装するにはStreamingEnabledを有効にする。
  • ModelのごとにLevelOfDetailを設定する。
  • MeshPartのRenderFidelityで忠実度を設定する。
  • StreamingMinRadiusStreamingTargetRadiusで範囲を指定する。
  • ReplicationFocusでストリーミングとシミュレーションの基準になるパーツを指定する。
  • ModelStreamingModeでモデルごとのストリーミング方法を設定する。
  • StreamingIntegrityModeでストリーミング範囲外に移動した際の挙動を設定する。

ゲームが大規模になればなるほどモデルのストリーミング方法やLOD処理などを意識して負荷軽減を意識しなければならなくなってきます。それぞれのゲームに合った最適な設定ができるように心がけましょう!

参考

https://create.roblox.com/docs/reference/engine/classes/Workspace
https://create.roblox.com/docs/reference/engine/classes/Model
https://create.roblox.com/docs/reference/engine/classes/Player

ランド・ホー Roblox開発チーム

Discussion