search
LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

[UE4] テクスチャのMipを強制的にロードする

テクスチャのMipmapを画面に描画させずに強制的にロードする方法になります。
間違ってたらごめんなさい、指摘ください。
検証UE4: 4.25.3
要C++

はじめに


(いつも引用すみません)
このような感じで低解像度Mipが出る前に、Mipロードを済ませておいてから表示させる的な事ができます。

もしActor単位で良ければ、前述参考リンクのPaperSloth's diaryさんのような形で実装できます。(BP実装)
全テクスチャのロード待つと遅くなるので一部テクスチャだけロード完了してから表示したい、
マテリアルのテクスチャを差し替えて使うのでそこだけ先にロードしておきたい、的な時に今回のは使えるかと思います。

テクスチャのMipを強制的にロードする

// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
if (IsValid(Texture))
{
  // 強制的なMipロードを有効化する秒数
  const float Seconds = 100000.0f;
  Texture->SetForceMipLevelsToBeResident(Seconds);
  Texture->bForceMiplevelsToBeResident = true;
}

UTexture2Dの親クラス、UStreamableRenderAssetに操作があります。
Secondsで指定した秒数の間、強制的なMipロードが入ります。

設定を解除する

// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
if (IsValid(Texture))
{
  Texture->SetForceMipLevelsToBeResident(0);
  Texture->bForceMiplevelsToBeResident = false;
}

設定解除しても即時メモリから破棄はされません。
この辺りはTextureStreamingのCacheに積まれた時と同じ挙動になります。

テクスチャのMipのロードの完了を取得する

// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
bool Finish = true;
if (IsValid(Texture))
{
  // 同数なら終わってる
  Finish = (Texture->GetNumResidentMips() == Texture->GetNumMipsForStreaming());
}

bForceMiplevelsToBeResident を設定して即時ロード完了とはなりません。
TextureStreamingを使用してロードしますので、完了までには時間がかかる場合があります。

GetNumResidentMips は現在TextureStreamingで読み込めてる数、
GetNumMipsForStreaming はTextureStreamingで使用できるMip数
となります。
ロードが完了すると同数になります。

ほか

  • 強制的にMipをすべて読み込む為、Textureの使用メモリが増えます。
    • 例えば画面表示的に1024サイズで良くても、4096までのMipが存在していれば全部読み込みます。
    • 現在この機能で「指定Mip以上だけ読み込む」的なのは無い筈です(あったら教えて下さい。。。)
  • エディターで確認する場合は、PIEですとキャッシュが残ったままになる事もありますのでStandaloneで確認するのをお勧めします。

ForceMiplevelsToBeResident の中でも優先的にロードさせる

あまり確証ないですが ForceMiplevelsToBeResident の設定後に下記Fast設定すれば優先されそうな感じがしました。
(細かい挙動までは追っかけてないです)

// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
if (IsValid(Texture))
{
  IStreamingManager::Get().GetTextureStreamingManager().FastForceFullyResident(Texture);
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3