UE4.27移动端后台暂停渲染线程并释放资源后显存未降低的问题咨询
UE4.27移动端后台暂停渲染线程并释放资源后显存未降低的问题咨询
各位好,我目前在基于UE4.27开发一个移动端项目,目标平台的性能比较有限,所以我想实现一个逻辑:当程序切换到后台时,暂停渲染线程并释放场景中的渲染资源,以此来降低显存占用。
我先在编辑器模式下做了测试,但结果和预期不符——显存并没有像我想的那样降下来。下面是我的实现思路和代码,想请教大家哪里出了问题:
我的实现步骤
- 首先创建了一个名为
MemoryOptimizer的类,包含两个核心方法:资源注册、资源释放与恢复 - 资源注册逻辑:遍历场景中所有Actor,收集它们的
UStaticMeshComponent对应的UStaticMesh资源,保存到类的TArray成员中 - 通过
FCoreDelegates::ApplicationWillEnterBackgroundDelegate委托,在程序进入后台时触发资源释放逻辑
关键代码片段
资源注册代码
// 遍历场景所有Actor收集静态网格资源 for (TActorIterator<AActor> It(GetWorld()); It; ++It) { AActor* Actor = *It; TArray<UStaticMeshComponent*> MeshComponents; Actor->GetComponents<UStaticMeshComponent>(MeshComponents); for (auto* Comp : MeshComponents) { if (Comp && Comp->GetStaticMesh()) { // 将静态网格指针注册到优化器中 optimizer->RegisterDefaultResources(Comp->GetStaticMesh()); } } }
资源释放代码
// 遍历注册的资源进行释放 for (auto Res : DefaultResources) { // 释放纹理资源 if (UTexture2D* Tex = Cast<UTexture2D>(Res)) { if (Tex->Resource) { Tex->ReleaseResource(); } } // 释放静态网格资源 else if (UStaticMesh* Mesh = Cast<UStaticMesh>(Res)) { if (Mesh->GetRenderData()) { for (auto& LOD : Mesh->GetRenderData()->LODResources) { ENQUEUE_RENDER_COMMAND(ReleasePositionVBResource)([lodRes = LOD.VertexBuffers.PositionVertexBuffer](FRHICommandListImmediate& RHICmdList) { auto& res = const_cast<FPositionVertexBuffer&>(lodRes); res.ReleaseResource(); }); ENQUEUE_RENDER_COMMAND(ReleaseMeshVBResource)([lodRes = LOD.VertexBuffers.StaticMeshVertexBuffer](FRHICommandListImmediate& RHICmdList) { auto& res = const_cast<FStaticMeshVertexBuffer&>(lodRes); res.ReleaseResource(); }); ENQUEUE_RENDER_COMMAND(ReleaseIBResource)([lodRes = LOD.IndexBuffer](FRHICommandListImmediate& RHICmdList) { auto& res = const_cast<FRawStaticIndexBuffer&>(lodRes); res.ReleaseResource(); }); } } } }
后台触发释放的调用代码
SCOPED_SUSPEND_RENDERING_THREAD(false); StopRenderingThread(); RHIExit(); GIsRunning = false; MemoryOptimizer->OptimizerBackgroundProcess(); // 这里调用上面的资源释放逻辑
测试结果
在编辑器模式下,我确认渲染线程确实已经停止了,但显存占用完全没有下降。我实在搞不清楚问题出在哪里,有没有大佬能帮我分析一下?
内容来源于stack exchange
相关产品推荐
相关产品推荐

