检测Bundle的引用关系错乱程度

一般来说Bundle之间共同使用的资源会提取出来为一个公用Bundle,但是可能不注意的情况下会导致Bundle下的Prefab引用到了其他Bundle的资源,若这种情况一直积累,就有可能发生启动加载Bundle的时候连带引用加载了一堆Bundle,启动卡顿及占用内存。所以需要根据个项目不同的Bundle打包策略定制一个检测Bundle的错误引用关系,及时纠正。

一般来说都是按目录就区分Bundle的,大概的思路就是这样:

public void Start()
{
    //获取所有的Prefab和材质
    string[] listString = AssetDatabase.FindAssets("t:Prefab t:Material", new string[] { "Assets/AssetsPackage" });

    for (int i = 0; i < listString.Length; i++)
    {
        string cur = listString[i];

        List<string> refs = new List<string>();
        string assetPath = AssetDatabase.GUIDToAssetPath(cur);
        string headPath = GetHeadPath(assetPath);//获取当前资源应该在的Bundle

        string[] names = AssetDatabase.GetDependencies(new string[] { assetPath });  //依赖的东东
        foreach (var name in names)
        {
            bool is_common = false;
            //排除引用的是公用资源 commonRef需要定制(值为目录数组),有的第三方库,有的公用资源Bundle等,项目不同这个也不同
            foreach (var cc in commonRef)
            {
                if (name.Contains(cc))
                {
                    is_common = true;
                    break;
                }
            }

            if (!is_common)
            {
                if (name.Contains(headPath)) //不是用公用,看看引用的是不是自己所属的bundle
                {
                    is_common = true;
                }
            }

            //上面情况都不是的话应该是有问题的
            if (!is_common)
            {
                if (name == assetPath)
                {
                    is_common = true;
                }
            }

            if (!is_common)
                AddProblem(assetPath, name);
        }

        EditorUtility.DisplayProgressBar("Progress", (i + 1) + "/" + listString.Length, (i + 1) / listString.Length);

    }

    EditorUtility.ClearProgressBar();
    isDone = true;
    this.ShowNotification(new GUIContent("Done!"));
}



首页 我的博客
粤ICP备17103704号