- 再生中のUManaPlayerが参照しているUManaTextureに対して、別のUManaPlayerが参照するとゲームスレッドからのアクセスとレンダースレッドからのアクセスが競合する恐れがあります。
例えば、レンダーコマンドにキューイングされた処理で参照するリソースがコマンド完了前にゲームスレッド側で破棄されてしまいセグメント違反が発生するなどが考えられます。
そのため、UManaTextureとUManaPlayerは1対1の関係で実装することを推奨しております。
UManaTextureを使いまわす際の実装サンプルコード
UManaTextureを使いまわす際は、UManaPlayer::OnClosed デリゲートの呼び出しを待ってから別のUManaPlayerが参照するようにしてください。
UCLASS()
class USample : public UObject
{
public:
void PlayMovie(UManaMovie* ManaMovie, UManaTexture* ManaTexture);
protected:
UFUNCTION()
void OnManaPlayerClosed();
private:
UManaPlayer* ManaPlayers[2];
int32 PlayerIndex { 0 };
bool bIsClosed{ true };
};
void USample::OnManaPlayerClosed()
{
bIsClosed = true;
++PlayerIndex;
if (PlayerIndex >= 2)
{
PlayerIndex = 0;
}
}
void USample::PlayMovie(UManaMovie* ManaMovie, UManaTexture* ManaTexture)
{
if ( ! (IsValid(ManaMovie) && IsValid(ManaTexture))) return;
if (bIsClosed)
{
ManaPlayers[PlayerIndex] = NewObject<UManaPlayer>();
ManaPlayers[PlayerIndex]->OnMovieClosed.AddDynamic(this, &USample::OnManaPlayerClosed);
ManaPlayers[PlayerIndex]->SetTexture(ManaTexture);
ManaPlayers[PlayerIndex]->OpenMovieSource(ManaMovie);
ManaPlayers[PlayerIndex]->Play();
bIsClosed = false;
}
else
{
if ( ! ManaPlayers[PlayerIndex]->bIsClosed())
{
ManaPlayers[PlayerIndex]->Close();
}
}
}