因为我们项目是用ab包管理资源的,所以自然就资源都打到ab包中。
这时候会出现一个问题,因为我们有很多衣服裤子之类的装扮,所以每个衣服裤子都会有自己的mesh和材质,自然也会有shader。但是shader我们用的是相同的,这个时候因为依赖加载,会每次都把shader重新加载进来,导致会多次加载shader的内存泄露问题。
可以看到shader加载得非常多一样的shader。
内存增长飞快。
解决办法:
shader单独打包:
也就是把游戏用到的shader全部单独打包到一个ab包中
private static void ShaderABHandle(List<AssetBundleBuild> abBuildList, string oldVersion, string newVersion)
{
//先把shader打到包里
List<string> shaderAssets = new List<string>();
for (var i = 0; i < AvatarManager.instance.shaderPreloader.Count; i++)
{
string sName = AssetDatabase.GetAssetPath(AvatarManager.instance.shaderPreloader[i]);
if (shaderAssets.Contains(sName))
{
continue;
}
shaderAssets.Add(sName);
}
abBuildList.Add(SetABName("Assets/Art/BundleResources/shaderAB", null, oldVersion, newVersion, "", shaderAssets));
}
这时会有一个shaderab.ab的ab包。然后打包里也会把这个ab包带到相关资源的依赖项里
然后加载时只要有依赖加载就可以了,也就是从最底层的依赖项往外递归加载。
这时再运行游戏查看,可以发现没有泄露了
总结一下:所有公用的资源最好打成一个包,如果一个包太大可以考虑分类打不同的包。这样依赖项带上这个ab包就不会重复加载了