Unhandled Exception: 0xc0000094 at ConvertFrameTime の発生原因に関しまして

お疲れ様です。

<br/>

inline FFrameTime ConvertFrameTime(FFrameTime SourceTime, FFrameRate SourceRate, FFrameRate DestinationRate)

<br/>

上記メソッド内にて稀にクラッシュが発生しております。

発生タイミングとしまして特定のタイミングは無さそうでして、WindowsでのROMでプレイ中に突然発生するような状況になります。

こちらに関してどういった事が原因として考えられますでしょうか?

<br/>

お手数をおかけして申し訳有りませんが、よろしくお願いいたします。

<br/>

以上です。

再現手順
再現手順は未確定で、数日に1件程度発生しております

SourceTimeが0になっているためゼロ除算例外がでています。

どの関数から呼び出されているかが分かれば、SourceTimeの出どころを推測することに役立ちます。クラッシュ時のコールスタックはございますか?

すいません、貼り忘れました。コールスタックは下記になります。

ConvertFrameTime(FFrameTime, FFrameRate, FFrameRate) FrameRate.h:286

UMovieSceneSequencePlayer::PostEvaluation(const FMovieSceneContext &) MovieSceneSequencePlayer.cpp:1491

UE::MovieScene::FSequenceInstance::PostEvaluation() MovieSceneSequenceInstance.cpp:462

FMovieSceneEntitySystemRunner::GameThread_PostEvaluationPhase(UMovieSceneEntitySystemLinker *) MovieSceneEntitySystemRunner.cpp:1231

FMovieSceneEntitySystemRunner::FlushNext(UMovieSceneEntitySystemLinker *) MovieSceneEntitySystemRunner.cpp:413

FMovieSceneEntitySystemRunner::FlushOutstanding(double, ERunnerFlushState) MovieSceneEntitySystemRunner.cpp:495

UUMGSequenceTickManager::HandleSlatePostTick(float) UMGSequenceTickManager.cpp:292

[インライン化] Invoke(void (UMovieSceneSequenceTickManager::*)(float), UMovieSceneSequenceTickManager *&, float &&) Invoke.h:66

[インライン化] UE::Core::Private::Tuple::TTupleBase::ApplyAfter(void (UMovieSceneSequenceTickManager::*&)(float), UMovieSceneSequenceTickManager *&, float &&) Tuple.h:320

TBaseUObjectMethodDelegateInstance::ExecuteIfSafe(float) DelegateInstancesImpl.h:689

[インライン化] TMulticastDelegateBase::Broadcast(float) MulticastDelegateBase.h:258

TMulticastDelegate::Broadcast(float) DelegateSignatureImpl.inl:1080

FSlateApplication::TickAndDrawWidgets(float) SlateApplication.cpp:1739

FSlateApplication::Tick(ESlateTickType) SlateApplication.cpp:1582

FEngineLoop::Tick() LaunchEngineLoop.cpp:5750

[インライン化] EngineTick() Launch.cpp:60

GuardedMain(const wchar_t *) Launch.cpp:189

LaunchWindowsStartup(HINSTANCE__ *, HINSTANCE__ *, char *, int, const wchar_t *) LaunchWindows.cpp:271

WinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int) LaunchWindows.cpp:339

フレームレートを変更する関数 UMovieSceneSequencePlayer::SetFrameRate などをタイトル内から利用されていますか?

社内でもこのコールスタックを持つクラッシュが起きたことがあり、上記関数に"Attempting to set sequence~"というエラー出力が追加されています。

クラッシュ時のログを一度ご確認いただけますでしょうか。

お待たせしました。

コード内に SetFrameRate の利用箇所は見当たりませんでした。

また、"Attempting to set sequence~"のようなエラー出力はありませんでした。

ご調査ありがとうございます。SetFrameRateの利用可所が無い件とエラーなどが見当たらない件承知しました。

特に操作が加わっていないとすると、通常SourceTimeは対象のアニメーションから取り出されたフレームレート値が使われているはずです。

問題が発生するUMGおよびアニメーションは判明していると思うのですが、このアニメーション再生にあたって再生開始停止や再生位置の制御、UMGの破壊などを含め外部からどのような操作が行われる可能性があるか把握していればご共有いただけますと幸いです。

またクラッシュ時のFSequenceInstance::Contextの中のフレームレートや再生位置、ステートなどに関してもお気づきの点があれば同じようにご共有ください。

SourceTime値はFMovieScenePlaybackPosition::SetTimeBaseで更新されていると思います。再現性があるのであればこの関数などで異常な値の設定を検証するようなコードを追加してみるのも問題を検出するのに役立ちそうです。

お疲れ様です。

下記の PlaybackSpeed が影響しているようでした。

FWidgetAnimationHandle UUserWidget::PlayAnimation(UWidgetAnimation* InAnimation, float StartAtTime, int32 NumberOfLoops, EUMGSequencePlayMode::Type PlayMode, float PlaybackSpeed, bool bRestoreState)

ひとまず、PlaybackSpeed にて小さな実数値を利用しないように対応いたします。

ご対応ありがとうございました。大変助かりました。

以上です。

PlaybackSpeedによってこの問題が引き起こされていたことを特定頂いて問題の解決に至った件承知しました。

PlayAnimationに与えるPlaybackSpeedを極小の値にするなどの動作を検証しましたがクラッシュにつながるような結果を得ることはできなかったためバグとして起票は見送らせていただこうかと思います。

それでは本件をクローズさせていただきます。