お世話になっております。
Cinematic MipのStreaming完了を検知する方法についてお訊きしたいです。
TexturePropertiesのNumCinematicMipLevelsとUMaterialInterface::SetForceMipLevelsToBeResident()を組み合わせて
カットシーン中のみ高解像度テクスチャを利用する機能の検証を行っています。
このとき、SetForceMipLevelsToBeResident()の実行により高解像度MipのStreamingが可能になったあと、当該テクスチャのStreamingの完了を検知する方法はありますでしょうか?
下記について手元で検証したところ、期待した結果が得られませんでした。
・UStreamableRenderAsset::IsFullyStreamedIn()
NumCinematicMipLevelsが設定されていない場合はこちらの関数が有効な手段となるかと思うのですが、
NumCinematicMipLevelsを1以上に設定した上でSetForceMipLevelsToBeResident()を呼び出し、NumCinematicMipLevelsの値が無視されるようになったケースが考慮されていないように見受けられました。
・UStreamableRenderAsset::RegisterMipLevelChangeCallback()
こちらの関数を呼び出した時点で、Streaming完了を待たずCallbackStreamingDone()の実行条件が満たされていました。
もしStreaming完了を検知する方法が他にございましたら、ご教示ください。
よろしくお願いいたします。
[Attachment Removed]
UStreamableRenderAsset::WaitForStreamingがブロッキングでオンフライトで走っているストリーミングを待つ関数です。
非ブロッキングで判定したい場合は上記関数内で利用されているHasPendingInitOrStreaming(true)が利用できます。
[Attachment Removed]
> HasPendingInitOrStreaming(true)を各テクスチャから呼び出し続けるしかないのではと考えています。こちらについてご意見をお伺いしたいです。
はい。その認識で間違いございません。RegisterMipLevelChangeCallbackのようなコールバックでCinematicMipsを考慮したものはなく、ポーリング(ないしは一定間隔でのチェック)が必要になってしまいます。
[Attachment Removed]
ご回答ありがとうございます。承知しました。
完全ではないかもしれませんが、IsFullyStreamedIn()を下記の通り編集すると、所望の挙動をしているように見受けられましたので、念のため共有させていただきます。
int32 FullyStreamedNumLODs = CachedSRRState.MaxNumLODs - NumCinematicMipLevels;
↓
int32 FullyStreamedNumLODs = ShouldMipLevelsBeForcedResident() ? CachedSRRState.MaxNumLODs : CachedSRRState.MaxNumLODs - NumCinematicMipLevels;
[Attachment Removed]
情報共有ありがとうございます。確かにこの変更によってCinematicMipsストリーミングを待つことが出来そうです。
確実に取り込まれることはお約束できませんが機能追加要望としてデータベースに登録させていただきました。
[Attachment Removed]
ご回答いただきありがとうございます。
HasPendingInitOrStreaming(true)が求めていたものに近い機能でした。
こちらの関数は、SetForceMipLevelsToBeResident()の実行後、①Streaming開始まではFalse、②Streaming開始後にTrue、③Streaming終了後はFalseという挙動になるかと思います。
③の状態になっているかどうかを検知したいのですが、①と③を区別するためには毎フレーム(そうでなくとも定期的に)HasPendingInitOrStreaming(true)を各テクスチャから呼び出し続けるしかないのではと考えています。こちらについてご意見をお伺いしたいです。
よろしくお願いいたします。
[Attachment Removed]