【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で忠実度を設定する。 -
StreamingMinRadiusとStreamingTargetRadiusで範囲を指定する。 -
ReplicationFocusでストリーミングとシミュレーションの基準になるパーツを指定する。 -
ModelStreamingModeでモデルごとのストリーミング方法を設定する。 -
StreamingIntegrityModeでストリーミング範囲外に移動した際の挙動を設定する。
ゲームが大規模になればなるほどモデルのストリーミング方法やLOD処理などを意識して負荷軽減を意識しなければならなくなってきます。それぞれのゲームに合った最適な設定ができるように心がけましょう!
参考
当社ではRobloxを活用したゲームの開発、 また企業の商品やサービスの認知度拡大に寄与する3Dワールドの制作など、 Robloxにおける様々な活用支援を行っております。 Robloxのコンテンツ開発をご検討されている企業様は、お気軽にご相談ください。 landho.co.jp/
Discussion