由于OpenGL ES着色器流程的特性,我们推荐使用PSO缓存来避免着色器编译的运行时开销。

note
shader只有在绘制调用中使用着色器时才会进行编译、
这导致许多移动端的OpenGL ES应用在渲染第一帧的时候马上就会出现卡顿,hitch

Note
一个单一的shader编译就可以导致app不满足Oculus要求的13.88ms

因此产生了 OpenGL ES3 拓展 OES_get_program_binary

UE4 的PSO cache system就使用了这个特性

开启PSO

在epic的source中找到ShaderPiplineCache.cpp
修改1415行
image.png
改成:FShaderPiplineCache::…

在Project Setting中找到Packaging,开启

  • Share Material Shader Code
  • Shared Material Native Libraries

打开 Device Profiles
image.png

找到Android 为其添加变量
image.png
并设置为1

找到AndroidEngine.ini并设置
image.png

添加:

  1. [DevOptions.Shaders]
  2. NeedsShaderStableKeys=true

保存

重启Editor
打开ProjectLauncher
新建CustomLaunchProfiles
选择项目,选择cook方式为by the book,然后勾选Android和Android_ASTC,
在CookedMaps选项中,选中Show all,然后选中想让被描述的文件/关卡。一般就全选了
在lunch中选择initial map,在additional Command Line Parameters 中输入 -logPSO
如果在手机PSO数据的时候总是崩溃,再添加一个参数 -NoVerifiedGC 禁用垃圾回收

后面设置好复杂, 我先不记录了。。。。

更多详情,见Unreal Documentation - Enabling the PSO Cache