public void Recycle(MatchBucket matchBucket) { //如果池子中的桶数量过多就释放一部分 while (m_queue.Count > 10) { m_queue.Dequeue(); } m_queue.Enqueue(matchBucket); }
public MatchBucket Fetch(int capacity) { MatchBucket matchBucket = null; if (m_queue.Count > 0) { matchBucket = m_queue.Dequeue(); } else { matchBucket = new MatchBucket(); } matchBucket.Init(capacity); return(matchBucket); }
/// <summary> /// 匹配算法 操作m_matchTeamQue /// 这个Update由MatchSystem进行调用 /// </summary> public void MatchUpdate() { //TODO:首先要检测是否能够进行匹配 if (m_matchingQue.Count < 1) { return; } //这里执行匹配算法 //1 关卡容量maxCount //2 队伍人数 //3 贪心算法 // 注意 Queue 除了on开头的方法以外 其他的方法都不修改队伍的状态 // 初始化 List <MatchBucket> matchBuckets = new List <MatchBucket>(); List <MatchTeamArg> matchTeamArgs = new List <MatchTeamArg>(); foreach (var item in m_matchingQue) { MatchTeamArg matchTeamArg = new MatchTeamArg { MatchTeam = item, index = -1 }; matchTeamArgs.Add(matchTeamArg); } //装桶 for (int i = 0; i < matchTeamArgs.Count; i++) { MatchTeamArg matchTeamArg = matchTeamArgs[i]; if (matchTeamArg.index != -1) { continue; } int j = 0; for (; j < matchBuckets.Count; j++) { MatchBucket matchBucket = matchBuckets[j]; int count = matchBucket.CurrentVolume; if ((matchBucket.Capacity - matchBucket.CurrentVolume) >= matchTeamArg.MatchTeam.CurrentCount)//如果容量足够 则添加 { matchBucket.matchTeams.Add(matchTeamArg.MatchTeam); matchTeamArg.index = j;//设置当前所在桶编号 } } if (matchTeamArg.index < 0)//需要新的桶 { var matchBucket = MatchBucketPool.Instance.Fetch(m_maxMemberCount); matchBucket.matchTeams.Add(matchTeamArg.MatchTeam); matchTeamArg.index = j; matchBuckets.Add(matchBucket); if (j != matchBuckets.Count - 1) { Log.Error("索引出现问题"); return; } } } // 把桶遍历 for (int i = 0; i < matchBuckets.Count; i++) { var matchBucket = matchBuckets[i]; if (matchBucket.CurrentVolume == matchBucket.Capacity)//桶的容量满了 { Log.Info($"第 {i} 桶满足条件 向GameServer发送开启战斗请求"); //向matchSystem发送这几个队伍的id MatchQueueCompleteSingleMessage matchQueueCompleteSingleMessage = new MatchQueueCompleteSingleMessage(); // 将matchteam从匹配列表中删除 foreach (var item in matchBucket.matchTeams) { matchQueueCompleteSingleMessage.teamIds.Add(item.Id); matchQueueCompleteSingleMessage.barrierId = m_id; m_matchingQue.Remove(item);//从匹配队列中清除 } //向MatchSystem发送队伍匹配完成消息 m_matchSystemClient.PostLocalMessage(matchQueueCompleteSingleMessage); } else { //不符合 这里可以再进行一次桶合并策略,目前不做 进一步的算法优化 } } // 释放所有的桶 for (int i = 0; i < matchBuckets.Count; i++) { var matchBucket = matchBuckets[i]; matchBucket.Dispose(); } }