private static void DataAnalysis(Dictionary <string, List <KeyValuePair <string, Dictionary <string, ABUseInfo> > > > srcDatas) //private static void SingleDataAnalysis(string name, List<KeyValuePair<string, Dictionary<string, ABUseInfo>>> data) { //单独阶段只引用一次和多次的,输出结果备用。 List <List <PhaseABInfo> > phasesList = new List <List <PhaseABInfo> >(); Dictionary <string, List <PhaseABInfo> > phasesDic = new Dictionary <string, List <PhaseABInfo> >(); foreach (var sd in srcDatas) { var tmpList = new List <PhaseABInfo>(); foreach (var phase in sd.Value) { var phaseInfo = new PhaseABInfo(phase.Key); //phase.Key 阶段名称(login,selectchar,类似这种) foreach (var ab in phase.Value) { //ab.Key AB名字 phaseInfo.phaseAllABDic.Add(ab.Key, ab.Value); if (ab.Value.getCount == OnlyOnceUsedCount || ab.Value.containCount == OnlyOnceUsedCount) { phaseInfo.phaseOnlyOnceUsedABDic.Add(ab.Key, ab.Value); } } tmpList.Add(phaseInfo); { if (!phasesDic.ContainsKey(phase.Key)) { phasesDic.Add(phase.Key, new List <PhaseABInfo>()); } phasesDic[phase.Key].Add(phaseInfo); } } phasesList.Add(tmpList); } //先根据阶段变化顺序理清可能发生的阶段变化 Dictionary <string, PhaseABInfoTreeNode> phaseTree = new Dictionary <string, PhaseABInfoTreeNode>(); foreach (var phases in phasesList) { PhaseABInfo last = null; foreach (var phase in phases) { if (last != null) { if (!phaseTree.ContainsKey(last.phaseName)) { phaseTree.Add(last.phaseName, new PhaseABInfoTreeNode(last.phaseName)); } if (!phaseTree.ContainsKey(phase.phaseName)) { phaseTree.Add(phase.phaseName, new PhaseABInfoTreeNode(phase.phaseName)); } var pA = new PhaseABInfoToAnother(last.phaseName, phase.phaseName, last, phase); phaseTree[last.phaseName].AddNext(pA); phaseTree[phase.phaseName].AddLast(pA); } last = phase; } } //求交集 foreach (var phase in phaseTree) { if (phasesDic.ContainsKey(phase.Key)) { Dictionary <string, int> priority = new Dictionary <string, int>(); List <string> tmp = null; List <string> tmpI = null; List <string> tmpU = null; if (phase.Value.Nexts.Count > 0) { foreach (var pk in phase.Value.Nexts) { phase.Value.priority.Add(pk.Key, pk.Value.linkList.Count); //phasesDic[pk.Key].Count(); var ps = phasesDic[pk.Key]; foreach (var p in ps) { if (tmp != null) { tmpI = PhaseABInfo.Intersection(tmp, tmpI); tmpU = PhaseABInfo.Union(tmp, tmpU); } else { tmpI = p.AllABDicToList(); tmpU = p.AllABDicToList(); } tmp = p.AllABDicToList(); foreach (var k in tmp) { if (!priority.ContainsKey(k)) { priority.Add(k, 0); } priority[k]++; } } } if (tmpI != null) { foreach (var i in tmpI) { phase.Value.NeedLoadKeys.Add(i, (float)priority[i] / phasesDic[phase.Key].Count); } foreach (var d in PhaseABInfo.Diffenrence(tmpU, tmpI)) { phase.Value.CanLoadKeys.Add(d, (float)priority[d] / phasesDic[phase.Key].Count); } } else { Debug.LogError("if(tmpI != null) :" + phase.Key); } } } } //每个阶段的必加载项和可选加载项已经设置好了,下边要设置从当前阶段往其他阶段转换时可能需要的项 //填充到XML里 PhaseABPreloadInfos_EditorAnalysis.Clear(); foreach (var phase in phaseTree) { RuntimePhaseABPreLoadInfo rtPAB = new RuntimePhaseABPreLoadInfo(phase.Key); foreach (var n in phase.Value.NeedLoadKeys) { rtPAB.preloadWithPriority.Add(n.Key, n.Value); } foreach (var c in phase.Value.CanLoadKeys) { rtPAB.preloadWithPriority.Add(c.Key, c.Value); } PhaseABPreloadInfos_EditorAnalysis.Add(rtPAB.phaseName, rtPAB); } phasesList.Clear(); return; }