public void Heartbeat()
    {
        // Package HeartbeatMsg

        HeartbeatMsg heartbeatMsg = new HeartbeatMsg();

        heartbeatMsg.GameFrameNum = _gameFrameNum;

        if (_dPadMsgFromClient.Count > 0)
        {
            ControlManager.DPadInfo dPadMsg = _dPadMsgFromClient[_dPadMsgFromClient.Count - 1];
            if (dPadMsg != null)
            {
                heartbeatMsg.HasDpadMsg = true;

                dPadMsg.FrameNum = _gameFrameNum;
                heartbeatMsg.DPadMsgList.Add(dPadMsg);
            }
            //foreach (ControlManager.DPadInfo dPadMsg in _dPadMsgFromClient)
            //{
            //    dPadMsg.FrameNum = _gameFrameNum;
            //    heartbeatMsg.DPadMsgList.Add(dPadMsg);
            //}

            _dPadMsgFromClient.Clear();
        }

        // Send HeartbeatMsg
        SendHeartbeatMsgToClient(heartbeatMsg);

        _gameFrameNum++;
    }
    public void ReceiveControlMsgFromClient(object controlInfoMsg)
    {
        ControlManager.DPadInfo dPadInfo = controlInfoMsg as ControlManager.DPadInfo;
        //ButtonInfo buttonInfo = controlInfoMsg as ButtonInfo;

        if (dPadInfo != null)
        {
            lock (GameManager.LockObj)
                _dPadMsgFromClient.Add(dPadInfo);
        }
        //else if (buttonInfo != null)
        //{
        //    lock (GameManager.LockObj)
        //    {
        //        ButtonMsgOnFakeServer.Add(buttonInfo);

        //        //// Log
        //        //Debug.Log("SendToFakeServer at local frame:" + GameFrameNum);//GameManager.GetInstance()._matchFrame
        //        //PrintButtonInfo(buttonInfo);
        //    }
        //}
        //else
        //{
        //    Int64 frameNum = (Int64)controlInfoMsg;
        //    lock (GameManager.LockObj)
        //        FrameMsgOnFakeServer.Add(frameNum);
        //}
    }