SceneCapture频繁flush导致渲染线程和RHI线程互相长时间wait的问题

你好:

最近发现在移动端使用SceneCapture的时候,帧率会有严重下降的情况。Insight发现是有SceneCapture的时候,渲染线程和RHI线程都会出现长时间的wait,导致帧率下降。

​这是正常渲染的情况​

[Image Removed]

这是使用了SceneCapture的情况

[Image Removed]

​ 针对帧率下降的问题,有什么解决方法呢?

非常感谢!​

Hi, 理论上这个Flush不是必须的,在一帧内只要在最后一个renderer flush就好了

但是这个提交是5.6才提交的,相对与5.4,RDG进行了比较多的改动…

https://github.com/EpicGames/UnrealEngine/commit/782fb3303a63dd8275c87445186b2d6f90b8b77f

可以试一下 Engine\Source\Runtime\Renderer\Private\DeferredShadingRenderer.cpp ,将

调用 GraphBuilder.SetFlushResourcesRHI() 的地方需要加一些条件判断一下

感谢回复。

我们目前走的是前向管线,而5.6的代码确实和5.4相差非常大。EndFlushResourcesRHI()除了SetFlushResourcesRHI会执行,同时也会在SceneCaptureRendering的UpdateSceneCaptureContentMobile_RenderThread函数中的GraphBuilder.Execute()中被调用,导致出现问题

[Content removed]

[2025.06.21-17.21.04:062][654]LogAndroid: Error: Fatal error: [File:./Runtime/RHI/Private/PipelineStateCache.cpp] [Line: 925]

[2025.06.21-17.21.04:062][654]LogAndroid: Error: Consolidate was hit while Get/SetPSO was running

[2025.06.21-17.21.04:062][654]LogAndroid: Error: [Callstack] 0x0000007AA19C8838 libUnreal.so(0x000000000C6E1838)!TSharedPipelineStateCache<FRHIComputeShader*, FComputePipelineState*>::ConsolidateThreadedCaches()

[2025.06.21-17.21.04:062][654]LogAndroid: Error: [Callstack] 0x0000007AA19C7854 libUnreal.so(0x000000000C6E0854)!PipelineStateCache::FlushResources()

[2025.06.21-17.21.04:062][654]LogAndroid: Error: [Callstack] 0x0000007AA1C892BC libUnreal.so(0x000000000C9A22BC)!FRDGBuilder::EndFlushResourcesRHI()

[2025.06.21-17.21.04:062][654]LogAndroid: Error: [Callstack] 0x0000007AA1C95718 libUnreal.so(0x000000000C9AE718)!FRDGBuilder::Execute()

[2025.06.21-17.21.04:062][654]LogAndroid: Error: [Callstack] 0x0000007AA4349BB0 libUnreal.so(0x000000000F062BB0)!UpdateSceneCaptureContentMobile_RenderThread(FRHICommandListImmediate&, FSceneRenderer*, FRenderTarget*, FTexture*, FString const&, FRHICopyTextureInfo const&, bool, FGenerateMipsParams const&)

想了解一下如果是在5.4引擎,目前有没有比较好的正规修复方案呢?

非常感谢,期待回复~

Hi,能否试一下在MobileShadingRenderer.cpp的这段,改成下面这样?

if (bIsFirstSceneRenderer && !Views[0].bIsSceneCapture) { GraphBuilder.SetFlushResourcesRHI(); }