private void CreateBundleInfos(List <AssetReference> assetInfos, AssetBundleManifest manifest, PerformGraph.AssetGroups incomigGroups)
    {
        foreach (var assetReference in assetInfos)
        {
            if (IsUnityManifest(assetReference))
            {
                var unityManifest = assetReference;
                var bundleInfo    = new BundleInfo
                {
                    Name = unityManifest.fileName,
                    CRC  = GetCRCFromManifest(unityManifest.path)
                };

                var rawAssetPathesFromManifest = GetRawAssetPathesFromManifest(unityManifest.path);

                if (rawAssetPathesFromManifest.Any())
                {
                    // ���� � ���������� ���� "������" - ������� � ������ ����� ����� �� �������� ������
                    // ���� �����, �� �������� ������ ����� ��������� ��� ���������� ������, � ������� �����
                    // ���� �����.
                    var rawAssetPath = rawAssetPathesFromManifest[0];
                    rawAssetPath = RemoveAssetsFolderFromPath(rawAssetPath);

                    foreach (var incomigGroup in incomigGroups.assetGroups)
                    {
                        var groupFound = false;

                        foreach (var reference in incomigGroup.Value)
                        {
                            if (reference.path.Contains(rawAssetPath))
                            {
                                groupFound = true;
                                bundleInfo.CustomInfo.Add("GroupName", incomigGroup.Key);
                                break;
                            }
                        }

                        if (groupFound)
                        {
                            break;
                        }
                    }
                }

                foreach (var rawAssetPath in rawAssetPathesFromManifest)
                {
                    var pathWithoutAssetFolder = RemoveAssetsFolderFromPath(rawAssetPath);
                    var trunkatedAssetPath     = TruncatePathFromManifest(pathWithoutAssetFolder);
                    bundleInfo.AssetInfos.Add(trunkatedAssetPath);
                }

                Debug.Log(string.Format("Bundle {0} with {1} assets added to manifest.", bundleInfo.Name, bundleInfo.AssetInfos.Count));
                manifest.BundleInfos.Add(bundleInfo.Name, bundleInfo);
            }
        }
    }
        /// <summary>
        /// 刷新节点渲染
        /// </summary>

        #endregion

        /// <summary>
        /// 预览结果 编辑器连线数据,但是build模式也会执行
        /// 这里只建议设置BuildingCtx的ab颗粒度
        /// </summary>
        /// <param name="target"></param>
        /// <param name="nodeData"></param>
        /// <param name="incoming"></param>
        /// <param name="connectionsToOutput"></param>
        /// <param name="outputFunc"></param>
        public override void Prepare(BuildTarget target, NodeData nodeData, IEnumerable <PerformGraph.AssetGroups> incoming, IEnumerable <ConnectionData> connectionsToOutput, PerformGraph.Output outputFunc)
        {
            Debug.Log("prepare:" + this.GetType().Name + "-" + DateTime.Now.ToLongTimeString());
            if (incoming == null)
            {
                return;
            }

            //
            AssetMultiplePackageConfigList = new List <SubPackageConfigItem>();
            //prepare传入的资源
            this.incommingAssetGroup = incoming.FirstOrDefault();
            // this.BuildInfo = BDFrameworkAssetsEnv.BuildInfo;
            //this.BuildParams = BDFrameworkAssetsEnv.BuildParams;
            //初始化输出列表
            var outMap = new Dictionary <string, Dictionary <string, List <AssetReference> > >();

            foreach (var group in this.groupFilterPathDataList)
            {
                if (!string.IsNullOrEmpty(group.GroupPath))
                {
                    outMap[group.GroupPath] = new Dictionary <string, List <AssetReference> >();
                }
            }

            var assetABNameList  = new List <string>();
            var assetRefenceList = new List <AssetReference>();

            //buildAssetbundle节点传过来是 abname = arlist 这样的结构.
            foreach (var ags in incoming)
            {
                foreach (var group in ags.assetGroups)
                {
                    assetABNameList.Add(group.Key);
                    assetRefenceList.AddRange(group.Value);
                }
            }
            // //遍历分组
            // foreach (var groupFilter in this.groupFilterPathDataList)
            // {
            //     outMap[groupFilter.GroupPath].Add(assetPath, new List<AssetReference>(group.Value));
            // }

            //
            foreach (var abname in assetABNameList)
            {
                var assetPath = AssetDatabase.GUIDToAssetPath(abname);
                //遍历分组
                foreach (var groupFilter in this.groupFilterPathDataList)
                {
                    //匹配路径分组
                    if (!string.IsNullOrEmpty(groupFilter.GroupPath))
                    {
                        if (assetPath.StartsWith(groupFilter.GroupPath, StringComparison.OrdinalIgnoreCase))
                        {
                            //查询这一组资源
                            foreach (var ags in incoming)
                            {
                                foreach (var group in ags.assetGroups)
                                {
                                    if (group.Key.Equals(abname, StringComparison.OrdinalIgnoreCase))
                                    {
                                        //这里是以前面传来的 分组颗粒进行添加
                                        outMap[groupFilter.GroupPath].Add(assetPath, new List <AssetReference>(group.Value));
                                    }
                                }
                            }
                        }
                    }
                }
            }


            //一次
            if (connectionsToOutput != null)
            {
                foreach (var outpointNode in connectionsToOutput)
                {
                    var gf = this.groupFilterPathDataList.FirstOrDefault((gpd) => gpd.OutputNodeId == outpointNode.FromNodeConnectionPointId);
                    if (gf != null)
                    {
                        outputFunc(outpointNode, outMap[gf.GroupPath]);
                    }
                }
            }
        }
        /// <summary>
        /// 刷新节点渲染
        /// </summary>

        #endregion

        /// <summary>
        /// 预览结果 编辑器连线数据,但是build模式也会执行
        /// 这里只建议设置BuildingCtx的ab颗粒度
        /// </summary>
        /// <param name="target"></param>
        /// <param name="nodeData"></param>
        /// <param name="incoming"></param>
        /// <param name="connectionsToOutput"></param>
        /// <param name="outputFunc"></param>
        public override void Prepare(BuildTarget target, NodeData nodeData, IEnumerable <PerformGraph.AssetGroups> incoming, IEnumerable <ConnectionData> connectionsToOutput, PerformGraph.Output outputFunc)
        {
            Debug.Log("prepare:" + this.GetType().Name + "-" + DateTime.Now.ToLongTimeString());
            if (incoming == null)
            {
                return;
            }
            this.BuildingCtx = BDFrameworkAssetsEnv.BuildingCtx;

            //prepare传入的资源
            this.incommingAssetGroup = incoming.FirstOrDefault();

            //初始化输出节点
            foreach (var ags in incoming)
            {
                foreach (var ag in ags.assetGroups)
                {
                    this.AddOutputNode(ag.Key);
                }
            }

            //初始化输出列表
            var outMap = new Dictionary <string, List <AssetReference> >();

            foreach (var group in this.groupFilterPathDataList)
            {
                if (!string.IsNullOrEmpty(group.GroupPath))
                {
                    outMap[group.GroupPath] = new List <AssetReference>();
                }
            }

            //把depend、runtime内包含的移除掉
            foreach (var ags in incoming)
            {
                foreach (var group in ags.assetGroups)
                {
                    var assetList = group.Value.ToList();
                    for (int i = assetList.Count - 1; i >= 0; i--)
                    {
                        var assetRef = assetList[i];

                        foreach (var groupFilter in this.groupFilterPathDataList)
                        {
                            if (!string.IsNullOrEmpty(groupFilter.GroupPath))
                            {
                                //匹配路径
                                if (assetRef.importFrom.StartsWith(groupFilter.GroupPath, StringComparison.OrdinalIgnoreCase))
                                {
                                    assetList.RemoveAt(i);
                                    //依次按分组输出
                                    outMap[groupFilter.GroupPath].Add(assetRef);
                                }
                            }
                        }
                    }

                    outMap[group.Key] = assetList;
                }
            }

            //一次
            if (connectionsToOutput != null)
            {
                foreach (var outpointNode in connectionsToOutput)
                {
                    var groupFilter = this.groupFilterPathDataList.FirstOrDefault((gf) => gf.OutputNodeId == outpointNode.FromNodeConnectionPointId);
                    if (groupFilter != null)
                    {
                        var kv = new Dictionary <string, List <AssetReference> >()
                        {
                            { groupFilter.GroupPath, outMap[groupFilter.GroupPath] }
                        };
                        outputFunc(outpointNode, kv);
                    }
                }
            }
        }