public MStepRes Handle(long playerId, MStepReq message)
        {
            var playerInputs = new List <PlayerInput>();

            foreach (var item in message.GameInput.Commands)
            {
                playerInputs.Add(new PlayerInput(item));
            }
            var input = new Msg_PlayerInput(message.GameInput.Tick, (byte)message.GameInput.ActorId, playerInputs);

#if DEBUG_SHOW_INPUT
            if (input.Commands != null && input.Commands?.Length > 0)
            {
                var cmd         = input.Commands[0];
                var playerInput = new Deserializer(cmd.content).Parse <Lockstep.Game.PlayerInput>();
                if (playerInput.inputUV != LVector2.zero)
                {
                    Debug.Log(
                        $"curTick{Tick} isOutdate{input.Tick < Tick} RecvInput actorID:{input.ActorId}  inputTick:{input.Tick}  move:{playerInput.inputUV}");
                }
            }
#endif
            var        gameId = GameClass.GetGameIdWithPlayerId(playerId);
            IGameClass game   = GameClass.GetGame(gameId);
            game.HandlePlayerInput(input);

            return(new MStepRes {
                ID = message.ID, MsgType = EResType.Pong
            });
        }
        public MStepRes Handle(long playerId, MStepReq message)
        {
            InitGameScene.RemoveWaitingPlayerId(playerId);
            var        gameId = GameClass.GetGameIdWithPlayerId(playerId);
            IGameClass game   = GameClass.GetGame(gameId);

            game.OnPlayerLeave(playerId);
            return(new MStepRes {
                ID = message.ID, MsgType = EResType.Pong
            });
        }