玩家数据处理调度器,玩家数据请求将被放到并行的若干个线程里进行处理。 有2类线程: 1、由DispatchAction调用发起的操作,此时执行线程无法指定。 2、调度器内部实例化一个线程,用以进行必须在一个线程里进行的操作。(未对外提供接口,目前假定用于为1中操作需要有序的服务。)
这个类采用多线程操作数据,所有成员都不能假定其工作的线程。 请注意四条约束: 1、UserInfo一旦实例化,内存不会被释放(只回收到池子里供重用,RoomInfo也是这样)。 2、对于只操作小于等于机器字长的数据的函数,不加锁(操作本来就是原子的)。 3、对于操作的数据大于机器字长的并且必须保证事务性更新的,需要加锁,每个UserInfo带有一个Lock属性(mono的读写锁有死锁bug,这里直接用普通锁)。UserInfo上持有的具有复杂结构的属性, 如果该结构/类里涉及集合操作,应该对该结构/类的数据进行封装并通过内部加锁或lockfree机制保证多线程操作安全。 4、此类方法除Get开头的方法外通常通过DispatchAction调用发起,具体线程分配考虑如下: a、玩家进入房间后基本上只有房间线程会修改玩家数据,故RoomProcessThread会直接修改玩家数据(通常都是简单数据或状态修改)。 b、玩家在大厅内但没有进入房间时的操作由Node发消息到Lobby,然后经DispatchAction调用各方法进行处理。 c、玩家在游戏中RoomServer会需要修改玩家数据,此时会发消息到Lobby,然后经DispatchAction调用各方法进行处理。
Inheritance: MyServerTaskDispatcher
Ejemplo n.º 1
0
        //===================================================================
        //野外分线相关处理
        //===================================================================
        internal void RequestSceneRoomInfo(ulong guid)
        {
            UserProcessScheduler dataProcess = LobbyServer.Instance.UserProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(guid);

            if (null != user)
            {
                if (user.CurrentState == UserState.Room)
                {
                    RoomInfo room = user.Room;
                    if (null != room)
                    {
                        SceneRoomInfo info = m_LobbyInfo.GetSceneRoomInfo(room.SceneType, room.RoomId);
                        if (null != info)
                        {
                            string            chapterName;
                            TableConfig.Level cfg = TableConfig.LevelProvider.Instance.GetLevel(info.m_SceneId);
                            if (null != cfg)
                            {
                                chapterName = "unknown";
                            }
                            else
                            {
                                chapterName = "unknown";
                            }
                            LobbyServer.Instance.SendStoryMessage(user, "onroominfo", info.m_RoomIndex, info.m_UserCount, info.m_TotalUserCount, info.m_RoomId, info.m_SceneId, chapterName);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        internal void HandleBuyLife(ulong guid)
        {
            UserProcessScheduler scheduler = LobbyServer.Instance.UserProcessScheduler;

            if (null == scheduler)
            {
                return;
            }
            // 响应玩家要求复活
            UserInfo user = scheduler.GetUserInfo(guid);

            if (null != user)
            {
                RoomInfo room = user.Room;
                if (null != room)
                {
                    Msg_LR_UserReLive resultBuilder = new Msg_LR_UserReLive();
                    resultBuilder.UserGuid = guid;
                    resultBuilder.RoomId   = user.CurrentRoomID;
                    LobbyServer.Instance.RoomSvrChannel.Send(room.RoomServerName, resultBuilder);

                    LogSys.Log(LOG_TYPE.INFO, "BuyLife Guid {0}", guid);
                }
            }
        }
Ejemplo n.º 3
0
        internal void RequestSceneRoomList(ulong guid)
        {
            UserProcessScheduler dataProcess = LobbyServer.Instance.UserProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(guid);

            if (null != user)
            {
                if (user.CurrentState == UserState.Room)
                {
                    RoomInfo room = user.Room;
                    if (null != room)
                    {
                        List <SceneRoomInfo> list     = m_LobbyInfo.GetSceneRoomList(room.SceneType);
                        JsonData             jsonList = new JsonData();
                        int ct = list.Count;
                        for (int i = 0; i < ct; ++i)
                        {
                            JsonData json = new JsonData();
                            json.Add(list[i].m_RoomIndex);
                            json.Add(list[i].m_UserCount);
                            json.Add(list[i].m_TotalUserCount);
                            json.Add(list[i].m_RoomId);
                            json.Add(list[i].m_SceneId);
                            jsonList.Add(json);
                        }
                        if (ct > 0)
                        {
                            LobbyServer.Instance.SendStoryMessage(user, "onroomlist", JsonMapper.ToJson(jsonList));
                        }
                    }
                }
            }
        }
Ejemplo n.º 4
0
        internal void AddUsers(int camp, params ulong[] users)
        {
            UserProcessScheduler dataProcess = LobbyServer.Instance.UserProcessScheduler;

            foreach (ulong user in users)
            {
                UserInfo info = dataProcess.GetUserInfo(user);
                if (info != null)
                {
                    info.LeftLife = UserInfo.c_LifeTimeWaitStartGame;

                    info.Room   = this;
                    info.CampId = camp;
                    if (m_Users.ContainsKey(user))
                    {
                        m_Users[user] = new WeakReference(info);
                    }
                    else
                    {
                        m_Users.Add(user, new WeakReference(info));
                    }
                }
            }
            UpdateUserCount();
        }
Ejemplo n.º 5
0
        internal void OnPickItem(Msg_RL_PickItem msg)
        {
            UserProcessScheduler dataProcess = LobbyServer.Instance.UserProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(msg.UserGuid);

            if (user != null && null != user.Room)
            {
                RoomInfo room = user.Room;
                if (room.RoomId == msg.RoomId)
                {
                    msg.RoomSvrName = room.RoomServerName;
                    LobbyServer.Instance.ForwardToWorld(user.UserSvrName, msg);
                }
            }
        }
Ejemplo n.º 6
0
        internal void HandleRoomStoryMessage(Msg_LRL_StoryMessage msg_)
        {
            UserProcessScheduler dataProcess = LobbyServer.Instance.UserProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(msg_.UserGuid);

            if (null != user)
            {
                RoomInfo info = m_LobbyInfo.GetRoomByID(user.CurrentRoomID);
                if (null != info)
                {
                    msg_.RoomId = user.CurrentRoomID;
                    LobbyServer.Instance.RoomSvrChannel.Send(info.RoomServerName, msg_);
                }
            }
        }
Ejemplo n.º 7
0
        internal void DelUsers(params ulong[] users)
        {
            UserProcessScheduler dataProcess = LobbyServer.Instance.UserProcessScheduler;

            foreach (ulong user in users)
            {
                UserInfo info = dataProcess.GetUserInfo(user);
                if (null != info)
                {
                    info.ResetRoomInfo();
                    LogSys.Log(LOG_TYPE.DEBUG, "LeaveRoom:{0}", user);
                }
                m_Users.Remove(user);
            }
            UpdateUserCount();
        }
        private void HandleRequestEnterScene(Msg_LB_RequestEnterScene msg_, PBChannel channel, int src, uint session)
        {
            UserProcessScheduler dataProcess = m_UserProcessScheduler;

            dataProcess.DispatchAction(dataProcess.RequestEnterScene, msg_);
        }