お世話になっております。
UE5.8更新後に SimCacheを利用しているNiagaraが一部描画されなくなる不具合が発生していて原因を調査したところ、
FNiagaraSystemSimulation::SimCacheTick_Concurrent
に対して以下のコードを追加することで症状が改善することがわかりました。
#if UE_WITH_PSO_PRECACHING
TArray\<FNiagaraSystemInstance\*\>\& AllInstances \= GetSystemInstances(ENiagaraSystemInstanceState::Running);
for (FNiagaraSystemInstance\* SystemInstance : AllInstances)
{
for (const FNiagaraEmitterInstanceRef\& EmitterRef : SystemInstance\-\>GetEmitters())
{
if (EmitterRef\-\>IsWaitingForPSOCaching())
{
EmitterRef\-\>UpdatePSOStatus();
}
}
}
#endif
こちらの修正方法が適切かどうかご確認いただけますでしょうか?
よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
本件詳細な調査を行って頂きありがとうございます。
現状発生ケースのデータが手元になく再現確認ができていない状態となりますが、
頂いた修正が有効とのことですので、PSOStatusのUpdatePSOStatus()が適切に実行できていない状況と思われます。
今回対応頂いている修正箇所に関しまして、SimCacheTick_Concurrentに追加頂いておりましたが、
適用箇所につきましては、FNiagaraSystemInstance::SimCacheTick_GameThread()への追加が望ましそうです。
※SimCacheTick_Concurrent()はワーカースレッドで行われる可能性がありますが、
UpdatePSOStatus()に関してはゲームスレッド外からの呼び出しが問題となるケースが確認されており、
類似ケースで直近CL50604672やCL50942158にてゲームスレッド化対応が行われておりました。
void FNiagaraSystemInstance::SimCacheTick_GameThread(UNiagaraSimCache* SimCache, float DesiredAge, float DeltaSeconds, const FGraphEventRef& MyCompletionGraphEvent)
{
...
// If the attached component is marked pending kill the instance is no longer valid
if (GetAttachComponent() == nullptr)
{
Complete(true);
return;
}
//以下追加
#if UE_WITH_PSO_PRECACHING
for (const FNiagaraEmitterInstanceRef& EmitterRef : Emitters)
{
if (EmitterRef->IsWaitingForPSOCaching())
{
EmitterRef->UpdatePSOStatus();
}
}
#endif
お手数ですが上記修正で改善するかご確認頂けますと幸いです。
よろしくお願いいたします。
[Attachment Removed]