public void RemovePlayer(SocketAsyncEventArgs args, bool bCloseRoomIfNoUser)
    {
        bool       ret = false;
        PlayerInfo pi  = GetPlayer(args);

        if (pi == null)
        {
            Log($"RoomManager RemovePlayer Error - Player not found!");
            return;
        }

        // 如果该玩家还没有离开房间, 则要离开这个房间
        RoomLogic roomLogic = Rooms[pi.RoomId];

        if (roomLogic.IsOnline(pi.Enter.TokenId))
        {
            roomLogic.Offline(pi.Enter.TokenId);

            // 通知大厅
            UpdateRoomInfoToLobby(roomLogic);
        }

        // 最后看是否需要关闭房间
        if (roomLogic.CurPlayerCount == 0 && bCloseRoomIfNoUser)
        {                     // 关闭房间
            roomLogic.Fini(); // 结束化
            Rooms.Remove(pi.RoomId);
            // 通知大厅:删除房间
            Protobuf.Lobby.UpdateRoomInfo output2 = new Protobuf.Lobby.UpdateRoomInfo()
            {
                RoomId   = roomLogic.RoomId,
                IsRemove = true,
            };
            MixedManager.Instance.LobbyManager.SendMsg(Protobuf.Lobby.LOBBY.UpdateRoomInfo, output2.ToByteArray());
        }
        Players.Remove(args);
    }