【UE5.6 リリースノート確認】高速ジオメトリストリーミングプラグイン ② ~FGS導入~

Eyecatch

Unreal Engine 5.6 リリース ノート | Unreal Engine 5.6 ドキュメンテーション | Epic Developer Community

前回は高速ジオメトリストリーミングプラグインの基盤になっている「ランタイム セル トランスフォーマー機能」について確認しました。

UE5.6 のランタイムセルトランスフォーマーを試してみる - Self-Taught CODE Tokushima Tech Blog

では、今回は高速ジオメトリストリーミングプラグイン、略して FGS を確認していきます。

高速ジオメトリストリーミングプラグイン

以下のように、リリースノートにも詳しく記述がありますし、World Building Guide の方にも同じような記述が見つかります。

日本語訳のページの方を引用します。

高速ジオメトリ ストリーミング プラグインは、不変の静的ジオメトリでゲームプレイに影響しないアクタの高速ストリーミングを実現する目的でビルドされています。 処理の速い軽量のメソッドを使用して、ランタイム データ レイヤーや HLOD のような既存の World Partition 機能を犠牲にすることなく、グラフィックおよび物理シーンとの間での静的ジオメトリの登録と登録解除を行います。

このプラグインは、World Partition のランタイム セル トランスフォーマー機能を活用して、プレイ イン エディタ (PIE) に入ったときとクック時に発生するストリーミング生成フェーズ中に高速ジオメトリ ストリーミングの対象にできるものを定義します。 これにより、プロセスがシームレスで非破壊的なものになります。

いくつか気になるトピックが出てきています。

  • 不変の静的ジオメトリでゲームプレイに影響しないアクタの高速ストリーミング
  • ランタイムデータレイヤーHLOD のような既存の World Partition 機能を犠牲にすることなく
  • グラフィックおよび物理シーンとの間での静的ジオメトリの登録と登録解除を行う
  • このプラグインは、World Partition のランタイム セル トランスフォーマー機能を活用する

まず、最後の「ラインタイムセルトランスフォーマー機能を活用」というのは、前回 RCTs を調査するきっかけにもなりましたが、高速ジオメトリストリーミングプラグインRCTsプラグインであるということでしょう。

「(不変の)静的ジオメトリ」という点は、RCTs も「StaticMeshActors や Partitioned Actors (PCG, Foliage, etc) 」を対象にしていましたが、World Building Guide を見ると、どちらも Immutable の言及があるので、動的ではないものというのが重要なのでしょうか。

最後に「ランタイムデータレイヤー (Runtime Data Layer)」と「HLOD (Hierarchical Level Of Details)」 の機能を犠牲にすることなくという点は、ここだけではいまいち分かりません。

ということで、この記事では、まずは高速ジオメトリストリーミングプラグイン(以降は FGS) を使ってみて、RCTs との関係を試してみたいと思います。

FGS を使う準備

リリースノートでは以下の手順のようです。

  • プロジェクトで高速ジオメトリ ストリーミング プラグインを有効にします。
  • 自身のレベルの [World Settings (ワールド セッティング)] - [World Partition Setup (World Partition 設定)] に FastGeoWorldPartitionRuntimeCellTransformer World Partition ランタイム セル トランスフォーマーを追加します。
  • PIE に入るか、プロジェクトのコンテンツをクックします。

ただ、World Building Guide の方を見ると以下の手順もあるようなので、今回はそちらも行います。

  1. Requires p.Chaos.EnableAsyncInitBody = true set in your project

こちらを有効にせずに実行すると以下のようにエラーログが出ます。

LogFastGeoStreaming: Error: FastGeoStreaming Cell Transformer requires 'p.Chaos.EnableAsyncInitBody' to be enabled.

レベルの準備

前回と同じレベルを使います。少し構造を分かりやすくするために、Outliner を以下のようにしています。

alt text

前回は、Instanced Static Mesh に対応していないマテリアルを使うという手段を使っていましたが、 Show ActorColoration CellTransformerISM というコマンドが用意されていることに気づいたのでこちらで可視化しています。

alt text

Outliner にある RCTs によって生成された Instanced Static Mesh を選択すると、それがどれを指しているかも確認できます。

1つ目の Instanced Static Mesh を選択している状態です。
こちらは、手前の像2つも Instanced Static Mesh になっているのですが、そちらを選択しても色が変わりませんでした。

alt text alt text

2つ目の Instanced Static Mesh を選択している状態です。
こちら、奥の長椅子2つも Instanced Static Mesh になっているのですが、そちらを選択しても色が変わりませんでした。

alt text alt text

設定の追加

まずは、プラグインを追加します。

alt text

さっそく、RCTs の設定の箇所に移動し、FastGeoWorldPartitionRuntimeCellTransformer を選択します。

alt text

以下を見て分かる通り設定項目が変化しています。

FGS RCTs
alt text alt text

まず、大きく違うのが、RCTs の方は PartitionActor, StatisMeshActor が指定されており、ドキュメントにもあった対象であることがわかりますが、FGS の方は設定項目が

Console Variables の変更

CVarp.Chaos.EnableAsyncInitBody = true のようにすると書いてあるのですが、どうやらこれは Read Only の属性のようなので、Console Variables Editor を利用してみます。

alt text

導入したのは初めてだったのですが、Window メニューから開いてすぐに検索できました。

alt text

true に変更します。

alt text

コンソールコマンドを入れてみても以下の結果が返りました。

p.Chaos.EnableAsyncInitBody = "true"

ただ、この方法だと、エディタを起動している間しか有効になりませんので注意してください。

さて、これで準備は整ったはずです。

FGS を使った状態での動作確認

World Partition としての動作(遠方が途中で表示される)は変わりません。

show ActorColoration FastGeo が用意されているので、そちらを有効化すると以下のような結果が得られました。

alt text

alt text

FGS が有効化されていない状態だと、すべてが赤くなるので、この結果は Static Mesh Actor が全て FGS の変換対象になっているということでしょう。

FastGeo.Show 1/0 のコマンドを使ってみても期待する結果が得られます。0 の場合は先程青く表示されていたオブジェクトが全て非表示になります。

デバッグの有効化

alt text

上記を有効化すると、以下のようなログも得られました。

LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: - FastGeoStreaming Debug Mode: Transforming Level '/Memory/UEDPIE_0_TestLevel1_3XIRL7XS80ZZN668T3OJ5AVUC.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   * Can't transform: Actor LandscapeStreamingProxy_D7T4VF4LBP34PHV9XOEVM5TIG_1_3_3_0 class is an unsupported class (LandscapeStreamingProxy)
LogFastGeoStreaming: - Transformation result of Level '/Memory/UEDPIE_0_TestLevel1_3XIRL7XS80ZZN668T3OJ5AVUC.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   -  Transformable Actors (Full)    = 6 (85.7%)
LogFastGeoStreaming:   -  Transformable Components       = 6 (40.0%)
LogFastGeoStreaming:   -  Non-Transformable Actors       = 1 (14.3%)
LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: - FastGeoStreaming Debug Mode: Transforming Level '/Memory/UEDPIE_0_TestLevel1_BRDRKB9I1IIYYGXT0CJDCWVTN.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   * Can't transform: Actor LandscapeStreamingProxy_D7T4VF4LBP34PHV9XOEVM5TIG_1_3_4_0 class is an unsupported class (LandscapeStreamingProxy)
LogFastGeoStreaming: - Transformation result of Level '/Memory/UEDPIE_0_TestLevel1_BRDRKB9I1IIYYGXT0CJDCWVTN.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   -  Transformable Actors (Full)    = 7 (87.5%)
LogFastGeoStreaming:   -  Transformable Components       = 7 (43.8%)
LogFastGeoStreaming:   -  Non-Transformable Actors       = 1 (12.5%)
LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: - FastGeoStreaming Debug Mode: Transforming Level '/Memory/UEDPIE_0_TestLevel1_55BC5XJ2P4UORWURSHMDN4R55.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   * Can't transform: Actor LandscapeStreamingProxy_D7T4VF4LBP34PHV9XOEVM5TIG_1_4_4_0 class is an unsupported class (LandscapeStreamingProxy)
LogFastGeoStreaming: - Transformation result of Level '/Memory/UEDPIE_0_TestLevel1_55BC5XJ2P4UORWURSHMDN4R55.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   -  Non-Transformable Actors       = 1 (100.0%)
LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: - FastGeoStreaming Debug Mode: Transforming Level '/Memory/UEDPIE_0_TestLevel1_COOO8TTAJUTBSY71Z81AXGKBW.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   * Can't transform: Actor LandscapeStreamingProxy_D7T4VF4LBP34PHV9XOEVM5TIG_1_4_3_0 class is an unsupported class (LandscapeStreamingProxy)
LogFastGeoStreaming: - Transformation result of Level '/Memory/UEDPIE_0_TestLevel1_COOO8TTAJUTBSY71Z81AXGKBW.TestLevel1:PersistentLevel'
LogFastGeoStreaming:   -  Non-Transformable Actors       = 1 (100.0%)
LogFastGeoStreaming: ------------------------------------------------------------------------

興味深いのは /Memory/UEDPIE_0 から始まるパスがあることです。これは、おそらく PIE のセッションごとのメモリ領域を指していると思いますが、Transform つまり変換が完了したアクターは Outliner から確認できなくなっています

alt text

RCTsWorldPartitionRuntimeCellTransformerISM を試した時は、Instanced Static Mesh としてまとめられていただけだったのでまだ分かりやすかったのですが、FGS の場合は確認すらできなくなっています

RCTs と合わせて実行してみる

alt text

この状態で実行してみます。

まず Outliner ですが以下のように RCTs を実行した時とは違っています。全ての StaticMeshActor は表示されなくなり、RCTs によって生成されたであろう Instanced Static Mesh のみ (WorldPartitionAutoInstancedActor0)になっています。

alt text

加えて、生成された Instanced Static Mesh も以下のように [Unnamed] のみの状態になっています。

alt text

以下は、それぞれの確認コマンドでの実行結果です。RCTsFGS は期待通り行われているようですね。

Show ActorColoration CellTransformerISM Show ActorColoration FastGeo
alt text alt text

この挙動に関して

Outliner の [Unnamed] のような状態については理解が及んでいないものの、この RCTsFGS の組み合わせについては、単に RCTsInstanced Static Mesh 化されたものが FGS の「不変の静的ジオメトリ」に一致するため FGS の変換対象となったと考えて良さそうです。

ちなみに、Outliner に残った WorldPartitionAutoInstancedActor0デバッグしてみると以下のようなログが出ています。

LogFastGeoStreaming: ------------------------------------------------------------------------
LogFastGeoStreaming: - FastGeoStreaming Debug Mode: Transformation on 1 selected actors 
LogFastGeoStreaming:   * Can't transform: Actor WorldPartitionAutoInstancedActor_0 has no transformable components
LogFastGeoStreaming:   -  Non-Transformable Actors       = 1 (100.0%)
LogFastGeoStreaming: ------------------------------------------------------------------------

WorldPartitionAutoInstancedActor0 は変換できなかったので残っているといえそうです。

今回の進捗

思ったより長くなってしまったので、一旦ここで切ろうと思います。

次に見ていくのは FGS の多くのオプションについてになりそうです。

alt text

FGS が変換する対象に関するものであると考えられるので、ここの理解が進めば RCTs が作成している WorldPartitionAutoInstancedActor0 の子の Instanced Static Mesh ActorFGS の対象になっている理由も理解できそうな気がします。

Appendix.

参考にさせていただいたリンク

出てきたコマンド・CVar

  • p.Chaos.EnableAsyncInitBody = true
    • CVar
    • 今回は Console Variables Editor を利用
  • Show ActorColoration CellTransformerISM
    • RCTsInstanced Static Mesh 化されたものを色を付けて表示
  • Show ActorColoration FastGeo
    • FGS で変換されたものを色を付けて表示
  • FastGeo.Show 1/0
    • FGS で変換されたものを表示・非表示