先简单说下shader的热更新测试
咱们在项目中使用shader,常见的,两种方式:优化
第一种是,给render附上一个材质,材质用某一个shader,这种状况,使用assetbundle热更新便可。ui
第二种是,runtime须要动态设置的shader,常使用Shader.Find()的方法来获取。这种方式,只有将shader放到Resources下,才能读取。可是Resources下的资源,是没法热更新的。spa
为了shader的热更,咱们就不能用Shader.Find,而是要本身去实现一个相似的调用方式。以下:code
咱们能够这样使用游戏
|
在使用以前,咱们把须要get的shader,拖到对应的脚本上。让后将对应的prefab打包成assetbundle,在游戏开始前load出来。ci
shaderlab的内存优化资源
shaderlab的内存问题,第一个就是standard shader。有几种可能会引入standard shader:get
1,import 模型的时候,自动建立的材质。
即便咱们去掉import materials的勾选,仍是会引入这个材质。想要完全地去掉,须要将默认render的材质清空,或者设置一个本身定义的材质:
设置为自定义的一个材质
2,美术或者程序,在制做场景,制做资源的时候,错误地使用了默认的材质。例如,在场景中建立了一个默认的cube,这个cube,就会使用默认的材质,默认材质用的就是standard shader。
对于游戏场景,咱们能够在保存场景的时候,自动替换全部场景中默认的材质。
替换掉默认材质,替换掉standard shader
经过游戏场景的保存,能大部分解决问题了。
可是,程序可能用到的材质,可能散落在各处。每一个项目理论上都能找出全部真正打包须要的全部prefab,而后用上面的方法统一替换包含standard的材质便可。
经过上面的方法,咱们项目,已经排除了standard shader,在真机测试中,shaderlab的内存,降到了20多M。
经过对standard的剔除,shaderlab降到了20M左右。咱们在看profile的分析的时候,发现这样一种状况,在profile中,咱们看到同一个shader,会有多个copy,例以下图的Diffuse。
在个人项目中,这种状况,是由于咱们的prefab,或者粒子特效,用的都是unity内置的shader,这些shader,在打包assetbundle的时候,是不会被打包的。致使存在冗余,
可是,我认为上面assetbundle零冗余方案的解决方案不是太好,因此,在研究和测试后,咱们有了本身的方法,去处理依赖unity内置资源的问题。
1, 下载unity的build in shader,导入到项目中(若是项目开始就这么作了,能省不少事),后续当咱们在材质上选择shader的时候,用的就不是build in的shader,而是导入到工程的shader,就和咱们其余shader同样,能够更改,能够热更,打包也不会冗余了。
2, 替换默认的材质。美术制做资源的时候,有时候会用默认的材质,除了Default-Material,还有Default-Particle(特效常常用),Sprites-Default。
咱们不可能要求美术注意到不用默认材质,对他们要求过高了,也不科学。因此,咱们须要用脚本作统一更改。咱们就用以前的脚本,对须要打包的资源,作统一替换材质便可
第一个红框内,是替换默认材质,第二个红框内,是替换为导入的shader。
经过这个优化以后,咱们在用profile看的时候,应该解决了90%的重复,还有不多数的重复,我没有仔细研究是哪里来的。咱们花20%的精力,解决掉80%的问题,shaderlab已经从20多M,降低到5M,我以为已经ok了。
这个方法带来的好处,除了shaderlab内存下降,也使咱们再也不依赖不可编辑的内置shader,让全部的shader均可改,可更新。
上面的方法,很好地运行了一段时间,可是在几个月后我再一次profile的时候发现,shaderlab,又涨到28M了,此次即没有standard,也没有内置shader冗余的问题。
在仔细地分析测试后,定位在咱们使用的后处理shader上,咱们使用的后处理是:Unity-Technologies/PostProcessing,根据筛选,咱们只用到其中的bloom 和 Color Grading,只有这两个,不该该,额外增长了20M多的内存吧。
最后分析,是由于后处理的multi_compile,致使过多的shader变种,而不少变种,是咱们不须要的
很是多的变种
解决方法是,根据需求,注释掉不须要的变种便可
注释掉之后(记得注释对应的shader内对应的#if 这类代码块),shaderlab从28M回到了6M多点,这就是一个合理的数据了。
最后,总结下shaderlab的内存优化:
清理standard的使用,不要让其进入打包内容
处理内置shader和默认材质的问题,替换为建立的材质和导入的shader,减小冗余。
清理复杂shader的multi_compile或者shader feature,删除或注释不须要的,减小shader变种 但愿这篇简单的说明,能给你们带来帮助。