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);
        }
Example #3
0
        /// <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();
            }
        }