【UE4】StreamableManager에 대해서

StreamableManager를 사용하는 목적



게임 중에 필요한 자산을 동적으로 로드할 때 사용합니다.
기본적인 동작을 기재합니다.
※4.2x의 내용입니다

사용하기 전에



이 클래스가 게임 중에 여러 개 존재하면,
로드하고 있는 것의 관리가 곤란해져 버립니다.
게임에 하나만 존재하는 디자인을 추천합니다.

로드 방법



EX
// シングルトン的なものから取得することを想定してます.
FStreamableManager &StreamableManager = MyApp::GetStreamableManager();

// ex : "Foo/AssetName.AssetName"
FStringAssetReference AssetReferense(TEXT(" ロードしたいもののパス "));

// 動的ロードを行います.
StreamableManager.RequestAsyncLoad(AssetReferense);

이렇게 로드합니다.
로드 상황 등을 조사하고 싶을 때는 반환 값으로 핸들이 전달되므로,
그쪽을 사용하면 잘 작동합니다.
완료되면 콜백을 호출할 수도 있습니다. ※후술

또, 패스를 직접 소스 코드중에 쓰면 알레이므로,
밖에서 취득하고 싶을 때는 소프트 레퍼런스를 이용하면 좋다고 생각합니다.
// ソフトリファレンスしたオブジェクトからパスを受け取る例
TSoftObjectPtr<UDataTable> LoadObject = /* ... */
:
const FStringAssetReference& AssetPath = LoadObject.ToSoftObjectPath();

핸들(FStreamableHandle)



진행 중인지 확인



로드중인가 어떤가 등은 요구했을 때에 받는 FStreamableHandle 로 판단할 수 있습니다.
동일한 자산에 대해 로드 요청을 두 번 이상 수행하면,
이미 메모리에 있기 때문에 버려질 때까지는 즉시 로드가 곧 끝나고, 콜백이 불립니다.
(핸들 Handle->IsLoadingInProgress() 가 true)
FStreamableHandle Handle = StreamableManager.RequestAsyncLoad(AssetReferense);

// 存在しないものなどをリクエストし、
// 失敗したときはnullptrになっているので、スマートポインタのチェックが必要です.
if ( Handle.IsValid() == false ) return;

// ロードが完了したかどうか(2回目のロードならすぐtrue).
if ( Handle->HasLoadCompleted() )
{
     // ロード完了.
}

if ( Handle->IsLoadingInProgress() )
{
    // ロード進行中.
}

로드 취소



로드 중이면 취소할 수 있습니다.
취소할 때는
등록한 완료 콜백은 호출되지 않습니다.
또한 이미 로드가 완료된 경우 취소할 수 없습니다.
Handle->CancelHandle();

로드한 항목 가져오기



핸들측으로부터 로드한 것을 취득할 수 있습니다.
Handle->GetLoadedAsset()

콜백



완료될 때 호출되는 콜백



완료되면 콜백을 받을 수 있습니다.
AssetReferense를 TArray로 복수 요청했을 때는 모두 끝났을 때에 콜백이 돌아옵니다.
여기 람다에서 설명합니다.
StreamableManager.RequestAsyncLoad(AssetReferense, []()
    {
        // 完了したときのコールバックをここに書きます.
    });

기타 콜백



완료시뿐만 아니라 다른 콜백에는 종류가 있습니다.
콜백을 다시 등록할 수도 있습니다.
다만, 로드가 완료할 때까지 등록하지 않으면 등록할 수 없기 때문에 주의입니다.
(특히 2회 이상 불려 갔을 때는 로드가 곧 끝납니다)
// 完了したときのコールバックを登録できます.
Handle->BindCompleteDelegate( ... )
// キャンセルしたとき.
Handle->BindCancelDelegate( ... )
// 更新したとき.
Handle->BindUpdateDelegate( ... )

조심하다



메모리 관리



로드한 수만큼 사용하는 메모리는 증가합니다.
불필요한 것은 로드하지 않는 & 메모리에서 파기하는 것을 잊지 마세요.

폐기 실수



로드를 요청한 후,
로드가 완료되기 전에 레벨을 전환하고,
전환 후 완료 콜백 처리가 호출되어 오류가 발생했습니다 ...
로드하는 동안 전환하는 장면은 취소가 필요하다고 생각합니다.

마지막으로



메모 쓰기에 가까운 내용이었지만,
읽어 주셔서 감사합니다.
잘못된 곳이 있으면 수정하겠습니다.

좋은 웹페이지 즐겨찾기