You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:14:31