【UE】Android PSO Caches的使用流程

温(mian)馨(ze)提(sheng)示(ming):

文章的内容是笔者跟着官网教程做的,但是还是有很多问题,发出来做个记录。文档是用别的软件写的,复制过来有格式问题,反正估计也没人看,所有也懒得改hhh。

  • PSO缓存介绍

PSO缓存的原理是首先创建UE4项目中使用的材质所需要的所有着色器的一个列表。此列表将用于加快UE4项目首次遭遇这些着色器时的编译进程。这又有助于减少材质需要编译新着色器时项目可能出现的卡顿。以下信息图说明了PSO缓存系统在UE4中的工作原理

官方文档图:

这个图更容易理解:

以下截图来自(PSO)How to use shader pipeline cache effectively. - 知乎

PSO介绍:

在D3D12中:

在Vulkan中:

在OpenGL中:

  • 进行构建设置

DefaultEngine.ini 或者(Platform)Engine.ini中增加以下设置,第一个NeedsShaderStableKeys需要设置为true,后面两变量也可以在设置中勾选,具体如下下图

在主菜单中选择 编辑(Edit) > 项目设置(Project Settings) > 打包(Packaging) > 打包(Packaging),然后启用选项:共享材质着色器代码(Share Material Shader Code)、共享材质本地库(Shared Material Native Libraries)

可以通过cvar来设置启用PSO,不过推荐下下图的方法,通过cvar设置容易忘掉

也可以在DefaultEngine.ini进行各种操作的设置

  • 收集PSO数据

项目在其中一个目标设备上运行时,必须生成用于 管线状态对象(Pipeline State Object)(PSO)缓存的数据部分。以下指南将讲述如何使用设备启动程序来创建并部署虚幻引擎4项目的一个版本,没提及的设置保持默认即可这将生成并采集PSO数据。

  1. 在 主工具栏 中点击 运行(Launch) 旁的白色箭头图标,然后选择 项目Launcher
  2. 在项目Launcher中找到 自定义启动描述(Custom Launch Profiles) 部分,按下 加号图标新添加一个自定义启动描述(Custom Launch Profiles)。 
  3. 在 项目(Project) 部分点击 项目(Project) 下拉菜单,并选择此描述文件相关联的项目。因为使用的是 VRS 来展示此工作流,所以 项目 被设为 VRS
  4. 在"烘焙"部分中将 如何烘焙内容(How would you like to cook the content) 选项设为 常规(By the Book)
  5. 在 烘焙平台(Cooked Platforms) 部分中可选择此描述应使用的平台和纹理格式。

【踩坑】:这个地方不能勾选带client后缀的平台,否则会报错:Client target not found

  1. 在 已烘焙地图(Cooked Maps) 部分中将 显示所有(Show All) 选中,然后选择此描述文件关联的所有地图。因为使用的是 VRS 来展示此工作流,请确认所有地图旁边均有勾选标(我这个测试的项目就只有一个地图)。
  2. 在 启动(Launch) 部分将 初始地图(Initial Map) 设为项目加载时使用的关卡。我们使用 VRS 来展示此工作流,因此初始地图被设为这个,此关卡含有初始UI画面。
  3. 然后在 额外命令行参数(Additional Command Line Parameters) 下输入 -logPSO,确保项目运行时PSO日志记录已启用。
  4. 修改名称后,点击项目Launcher右上角的 返回 按钮返回 自定义启动描述(Custom Launch Profiles) 菜单。
    1. 在 自定义启动描述(Custom Launch Profiles) 部分点击 启动此描述(Launch this Profile) 按钮开始烘焙和部署进程。
    2. 烘焙和部署进程开始后将显示以下窗口,显示编译进程和出现的错误,这边可以看到已成功。
    3. 编译完成并部署到目标设备后,使用者需要在项目所有可用关卡中进行游戏。进行此操作的目的是尝试加载游戏中使用的每个内容,以便材质使用的着色器被采集。需要将此流程重复几次,确保使用的所有内容均已加载。
    4. 在项目中完整游戏数次后将获得 rec.upipelinecache 文件。前往目标设备上的以下位置即可找到此文件:UE4Game\NameOfProject\NameOfProject\Saved\CollectedPSOs

    获得.stablepc.csv文件

    为使 管线状态对象(Pipeline State Object)(PSO)缓存系统拥有正确的功能,其必须将被请求的 着色器 映射到发出请求的 材质 上。使用 ShaderPipelineCacheTools 命令行来编译一个包含此映射信息的文件即可完成此操作。以下指南将说明如何使用ShaderPipelineCacheTools命令行来编译所需的文件。

    1. 首先在C盘根目录上创建一个名为 PSOCaching 的新文件夹(估计在C盘根目录建是为了缩短路径长度避免问题)。

    1. 接下来,打开以下路径中的UE4项目文件夹,查找 scl.csv(或者shk)文件。ProjectName\Saved\Cooked\PlatfourmYouCookedFor\ProjectName\Metadata\PipelineCaches

    1. 将Pipeline Caches文件夹内的两个 scl.csv 文件复制到在C盘根目录中创建的 PSOCaching 文件夹。
    2. 接下来将 rec.upipelinecache 文件(在目标设备上运行项目时生成的文件)复制到在C盘中创建的PSOCaching文件夹。
    3. 要生成需要的文件,首先要使用UE4命令行函数。要使用命令行函数,首先打开 Engine\Binaries\Win64 文件夹,查找 UE4Editor-Cmd.exe 文件。
    4. 【踩坑】:{请直接跳转到第十步,这几个地方是官方文档的方法,但本人在尝试时发现不行,没有生成应有的文件,推测是target字符数超出限制}

    右键点击UE4Editor-Cmd.exe文件,从显示的列表中选择 创建快捷方式 选项

    1. 将新建的快捷方式移至C盘根目录上创建的 PSOCaching 文件夹
    2. 右键点击 UE4Editor-Cmd.exe快捷方式,从显示的菜单中选择 属性 选项
    3. 在Target输入中 UE4Editor-Cmd.exe 之后添加以下命令行参数

    打开一个空文件并复制该路径

    然后加上*.uproject的路径

    在后面加入下列代码

    "ProjectPath\ProjectName.uproject" -run=ShaderPipelineCacheTools expand C:/PSOCaching/*.rec.upipelinecache C:/PSOCaching/*.shk ProjectName_GLSL_ES3_1_ANDROID.stablepc.csv
    

    如果你的版本为4.27.2以下就按照官网的格式来加

    "ProjectPath\ProjectName.uproject" -run=ShaderPipelineCacheTools expand C:/PSOCaching/*.rec.upipelinecache C:/PSOCaching/*.scl.csv ProjectName_GLSL_ES3_1_ANDROID.stablepc.csv
    

    将该整行代码复制并粘贴到快捷方式的target中

    点击 确认 关闭快捷方式属性对话框,然后双击 UE4Editor-Cmd.exe 快捷方式运行命令行

    1. 在PSOCaching文件中打开cmd,输入以下代码,可以和下图作对应

    EnginePath\Engine\Binaries\Win64\UE4Editor_Cmd.exe"ProjectPath\ProjectName.uproject" -run=ShaderPipelineCacheTools expand C:/PSOCaching/*.rec.upipelinecache C:/PSOCaching/*.scl.csv ProjectName_GLSL_ES3_1_ANDROID.stablepc.csv
    

    可以看到UE4.27文档中提及

    所以如果你的ue版本是4.27或UE5,换成以下代码

    EnginePath\Engine\Binaries\Win64\UE4Editor_Cmd.exe"ProjectPath\ProjectName.uproject" -run=ShaderPipelineCacheTools expand C:/PSOCaching/*.rec.upipelinecache C:/PSOCaching/*.shk ProjectName_GLSL_ES3_1_ANDROID.stablepc.csv
    

    运行后可以看到生成了该文件

    1. 命令行运行完成后将生成一个后缀为 stablepc.csv 的文件,在ue引擎的win64文件中,搜索找到后将其放置到C盘根目录上的PSOCaching文件夹中

    打开后可以看到数据在这里

    通过PSO缓存构建

    1. 接下来前往项目的 Build > Android > PipelineCaches 文件夹,将stablepc.csv文件复制到Pipeline Caches文件夹如未找到 PipelineCaches 文件夹,则创建新建一个,并放入stablepc.csv文件
    2. 重新打包,打包过程会将上述stablepc文件转为upipelincecache文件,打进包里

    【踩坑】:报错说是绝对路径什么的问题

    可以通过以下cmd指令重新在该手机上创建文件夹

    经过这一步后可以看到能启动成功

    1. 检查log中是否使用了PSO

    可以看到成功了

    验证文件中的PSO数据(可以不做)

    通过上面步骤我们已经完成PSO的流程,但是我们不知道PSO的数据是否是如我们预期的一样,现在我们在C:\Unreal4.27\UnrealEngineEX_4.27.2-release\Engine\Source\Runtime\OpenGLDrv\Private\OpenGLShaders.cpp文件中添加Log输出

    删除shk和csv文件后再次部署运行可以看到Log里面gllinkprogram运行了25次

    通过之前的方法生成.stablepc.csv文件,可以看到也是加载了25个PSO

    再次打包部署可以看到Log中只调用了三次gllinkprogram

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值