我们的第一个目标就是看怎么通过修改engine中的设置,或者优化materials的设置,来减少需要编译的permutation数量。当然,我们不是建议你在ship时候将这些设置Disable,而是让你在开发shader时,通过Disable这些设置,暂时性减少编译permutation的数量,从而提高开发效率。
在per-material basis层面上,有几个地方可以优化。第一个就是Usage设置。
首先来看下我们改变哪些设置会让permutation编译数量减少。这些设置看起来是代表engine中特定的vertex factory。也就是说,如果你在一个新的vertex factory中,选中Automatically Set Usage in Editor,就会导致产生permutation。关闭它,就会让你有多一点控制,让artist再考虑下如何为material赋值。但是,即使这样也不会减少很多permutation。
接下来,你可以看看Quality and Static 开关的使用。任何可能的Quality and Static组合都需要新的permutation。因此,大量的static开关会导致大量的permutation。当然,这种方法也不会大量地减少permutation。另外,还有点事情你要记住,如果你是在尝试迭代,或者面对着空场景,你可能不需要设置它们。但是,如果是在runtime时候,static开关会提高性能的。
最后,我们来看下通过project setting来减少permutation。长期来看你是需要它们,但是我们也能暂时取消它们。当然,这需要Unreal 4.19版本以上。如果你去Project Setting > Render,那里有几个参数可以调整。当然,这还是要取决于你的工程或者测试需要,你可以保留一些设置为有效状态。如果当你在这里取消shader permutation,场景由于缺少需要的permutation,就会在viewport抛出warning。例如,当你尝试使用atmospheric fog,而Support Atmospheric Fog设置无效时,Unreal就会抛出”PROJECT DOES NOT SUPPORT ATMOSPHERIC FOG”。
Recompileshaders material <MaterialName>则将重新编译与名字匹配的第一个material。此时,不需要include任何路径信息。它通过调用material的PreEditChange/PostEditChange事件来完成。所以,这跟点击Material Editor中的Apply按钮是一样的。
Recompileshaders all将会编译所有东西。这个跟修改所有文件后,重新启动editor是一样的。这个可能会在修改即将结束时,用于确保permutation不是broken的,是非常有用的。Project Setting > Rendering Overrides (Local) > Force All Shader Permutation Support会保证你的代码在每个#if variation下编译。
我们已经学习过如何通过改变一些项目设置,来减少shader permutation总数量,从而达到加快重新编译的目标;通过使用recompileshader console命令,就可以避免所有shader都被重新编译,尽管下次editor启动时仍然需要全部重新编译;另外,我们也学习了在什么条件下,一些common proprecssor定义被设置,这也帮助我们了解哪些代码是跟我们目标相关的。 Next Post