UE5.8で SimCache使用したNiagaraが一部描画されない不具合の修正方法に関して

お世話になっております。

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]

ご回答ありがとうございます

そちらの内容で対応しておきます

[Attachment Removed]

ご確認ありがとうございます。

お手数おかけしますが、よろしくお願いいたします。

[Attachment Removed]