更多内容请查看我的个人网站
NoCodeWorld 的小地盘
PSO构建总流程
根据上面总流程图,我会分别一个个去讲解每一步的操作和需要额外处理的东西
开发环境
- 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的小工具插件,下面会大概说一下实现思路
我们小工具就如图所示,支持自动跑图录取和手动录取,因为我们是大世界,场景太大,如果让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