由于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行
改成:FShaderPiplineCache::…
在Project Setting中找到Packaging,开启
- Share Material Shader Code
- Shared Material Native Libraries
打开 Device Profiles
找到Android 为其添加变量
并设置为1
找到AndroidEngine.ini并设置
添加:
[DevOptions.Shaders]
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 禁用垃圾回收
后面设置好复杂, 我先不记录了。。。。