UE5.7からUE5.8へ移行した際にUnknownRefMipsが大量に増える

5.7から5.8に移行したところStreamingメモリのあふれが発生しました。

<br/>

確認してみたところUnknownRefMipsによる最大ミップの読み込みが増えていました。

<br/>

おそらくFastGeo周りでこのあたり変化したように見えますが、FastGeoなのかどうかはつかめていません。

こちら解決方法ありますでしょうか?

[Attachment Removed]

再現手順

UE5.8のエディタービルドでUnknownRefMipsのテクスチャが増えているのを確認する。

[Attachment Removed]

今のところ以下の設定(UMaterialInterface::IsTexturesSamplingCacheGloballyEnabled()がfalse)だと発生しないまで確認できました。

s.StreamableAssets.UseSimpleStreamableAssetManager=0

r.Streaming.EnableTexturesSamplingStreamingCache=0

[Attachment Removed]

理解半分のなので確証はないですが、

UMaterialInterface::PostLoad()

でTextureStreamingDataを破棄してからのキャッシュを生成しているのが問題なのかなと疑っております。

[Attachment Removed]

おそらくSimpleStramableAssetMaangerの挙動の変化に起因していると思われます。

新方式ではTextureStreamingDataに含まれるスケール値を参照して適切にストリーミングを管理します。

しかし適切なTextureStreamingDataデータが無い場合UnknownRefになる可能性があります。

​

通常のUVでマッピングされたされたマテリアルであれば​、以下の方法でTextureStreamingDataを更新できます。

  • マテリアルの更新
  • Build > BuildTextureStreaming (ロードされているマテリアルのみ)
  • コンソールコマンド BUILDMATERIALTEXTURESTREAMINGDATA
  • Resaveコマンドレットに buildtexturestreamingforall を追加して実行
UnrealEditor.exe <YourProject>.uproject -run=ResavePackages -buildtexturestreamingforall
 -OnlySaveDirtyPackages -onlymaterials -projectonly -AllowCommandletRendering -AutoCheckOut -unattended

​

​これには例外がありまして、UVではなくワールド座標などからテクスチャ座標を作ったりするタイプのマテリアルなどはテクスチャストリーミング用のスケール値が計算できないケースがございます。

これらのマテリアルは以下のコマンドでログを有効してマテリアルの更新を行うと

Log TextureStreamingBuild Verbose 次のようにログに表示されます​。

TextureStreamingBuild: Verbose: Incomplete texcoord scale analysis for M_ProcGrid: (NoValues:0,T_GridChecker_A) ​​ひとまず問題の切り分けのために上記をご確認いただけますでしょうか。

​

​

[Attachment Removed]

>>・Resaveコマンドレットに buildtexturestreamingforall を追加して実行

こちらを行ってみましたが、改善しませんでした。

Log TextureStreamingBuild Verboseにて確認してみたところ

texcoord scaleの解析に成功しているにもかかわらず引き続きUnknownRefのものが2481枚ほど出ていました(UnknownRefの9割ほど)。

原因を調査してみたところ、

PostLoad で UMaterialInterface::ComputeCachedTexturesSamplingInfo()が走った時点で

テクスチャがコンパイル中だと、該当テクスチャがキャッシュから除外されます。

その後コンパイルが完了してもキャッシュは作り直されていないようでした。

暫定対処として、

FTextureCompilingManager::PostCompilation(TArrayView<UTexture* const>) 内の

AffectedMaterials のループで、各マテリアルに対して

UMaterialInterface::CacheTexturesSamplingInfo() を呼ぶようにしたところ、改善いたしました。

こちらの対処適切か、ご確認いただけますでしょうか?

[Attachment Removed]

ご確認ありがとうございます。解決に至らなかった件承知しました。

頂戴した情報を元に再現を試み、最終的に再現プロジェクトを作成することができ、テクスチャの非同期コンパイルをオフにすることで簡単にABテストできることを確認できました。

これを元に UE-400739 [SSAM]Textures that are still compiling are all counted as UnknownRef としてバグ登録しました。

ワークアラウンドですが、パッケージビルドでは通過しないコードであり影響も最低限に出来ていると思われます。正式な修正まではご利用いただいても問題ないように見えます。

[Attachment Removed]

ご確認ありがとうございます。

本対応はUE-400739の経過を待つとして、暫定対処が問題なさそうなのでクローズします。

[Attachment Removed]