UE4 PSO缓存

本文详细描述了在虚幻引擎4中使用PSO(预编译着色器对象)进行性能优化的全过程,包括自动和手动采集缓存文件、生成SHK文件、打包策略以及运行时加载和热更的处理。作者强调了在实际应用中的注意事项和可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更多内容请查看我的个人网站
NoCodeWorld 的小地盘

PSO构建总流程

image.png

根据上面总流程图,我会分别一个个去讲解每一步的操作和需要额外处理的东西

开发环境

  • UE版本:4.27.2
  • VS版本:2019

1.打包

首先,需要打一个可以实机收集PSO缓存文件的包

2.实机收集

自动采集

这里主要说一下录取的方式方法, 一种方式就是引擎自带的自动采集指令

Config/DefaultEngine.ini
[ConsoleVariables]
r.ShaderPipelineCache.Enabled=1
r.ShaderPipelineCache.LogPSO=1
r.ShaderPipelineCache.SaveBoundPSOLog=1

上述采集指令配置了以后直接打包,然后开始跑项目即可,会自动采集并且保存缓存文件到本地,如果你们是普通小场景项目上面方式就已经足够了,可直接跳到 采集完成

手动采集

我自己做了一个PsoCacheGather的小工具插件,下面会大概说一下实现思路
image 3.png

我们小工具就如图所示,支持自动跑图录取和手动录取,因为我们是大世界,场景太大,如果让QA去全部跑一遍有点吃力,所以直接做了一个自动跑图收集,如果你们项目组是小副本或者小场景直接手动跑图录取或者拉一条Line,然后摄像机沿着跑即可,这个看自己需求

我们项目因为是大世界场景,测试发现长时间全部跑下来会有问题,可能是实时一直在保存太大太频繁,所以我改成了自动跑图完再保存一次,中间不会实时保存,测试没问题

[ConsoleVariables]
r.ShaderPipelineCache.Enabled=0

首先配置中关闭自动开启,我们在开始录取的时候代码中开启

bool UPSOCacheGatherHelper::EnableShaderPipelineCache(bool bEnable)
{
	UE_LOG(LogPSO, Display, TEXT("EnableShaderPipelineCache %s"), bEnable ? TEXT("true") : TEXT("false"));
	auto Var = IConsoleManager::Get().FindConsoleVariable(TEXT("r.ShaderPipelineCache.Enabled"));
	if (Var)
	{
		Var->Set(bEnable ? 1 : 0);
	}
	return !!Var;
}

首先在一开始先开启总开关 r.ShaderPipelineCache.Enabled

bool UPSOCacheGatherHelper::EnableLogPSO(bool bEnable)
{
	auto Var = IConsoleManager::Get().FindConsoleVariable(TEXT("r.ShaderPipelineCache.LogPSO"));
	if (Var)
	{
		Var->Set(bEnable ? 1 : 0);
	}
	return !!Var;
}
bool UPSOCacheGatherHelper::LoadShaderPipelineCache(const FString& Name)
{
	UE_LOG(LogPSO, Display, TEXT("Load Shader pipeline cache %s for platform"), FApp::GetProjectName());
	return FShaderPipelineCache::OpenPipelineFileCache(FApp::GetProjectName(), GMaxRHIS
### UE4 初始化着色器失败解决方案 当遇到 UE4 初始化着色器失败的问题时,通常涉及多个方面的原因。以下是详细的排查和解决方法: #### 1. 检查图形驱动更新 确保所使用的显卡驱动是最新的版本。旧版驱动可能存在兼容性问题,影响着色器的初始化过程[^1]。 #### 2. 验证项目设置中的平台配置 确认项目的构建配置文件(Build Configuration)针对目标平台进行了正确的设置。特别是对于移动设备开发而言,某些特定选项可能会影响着色器加载行为[^2]。 #### 3. 清理并重新生成临时数据 有时缓存或中间文件可能会损坏而导致错误发生。尝试清理工程目录下的 `Intermediate` 和 `DerivedDataCache` 文件夹后再编译项目。 #### 4. 审核材质编辑器内的资源 复杂的自定义材质节点可能导致难以预料的行为;简化材质结构有助于排除潜在冲突源。另外也要注意是否存在非法操作比如除零等异常状况。 #### 5. 调整管线状态对象 (PSO) 缓存策略 如果应用程序频繁切换不同的渲染路径,则应考虑优化 PSO 的管理方式。通过提前离线收集与编译所需的状态组合可以减少运行时刻创建新实例的需求,从而提高成功率以及整体效率。 ```cpp // C++ 示例:强制刷新所有已知管道状态对象 void ForceRebuildAllPipelines() { FRenderResource::ReleaseResources(); GetRendererModule().GetPipelineStateCache()->Clear(); } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值