およそスキップ問題のサーバークライアントの同期

多くのオンライン同期方式がありますが、私はカップルが読み取ることができない、あまりにも面倒を見て、古い見ていません。だから私は単純にクイックスタートを容易にするため、について書きました。

実行する前に、サーバはUDP通信でなければならない、私は私がlidgren通信フレームワークを使用し、これを説明しませんが、私は知らない、あなたは私の過去の記事を見ることができます。

アイデアのコードサーバーが毎秒送信し、あなたはスレッドで行うことができます。

  パブリック 静的 ボイド対決()
        { 
            一方
            { 
                のThread.sleep(1000年)。
                出力(" 目前" + フレーム)。
                リスト <のNetConnection>すべて=のs_server.Connections。// GETコピー
                 //    all.Remove(msg.SenderConnection)。
                もし(all.Count> 0 
                { 
                    NetOutgoingMessage OM = s_server.CreateMessage()。
                    JsonDatasメッセージ= 新しいJsonDatas()。
                    message.jsons [ " タイプ" ] = " 5 " 
                    message.jsons [ " MSG " ] = フレーム;
                    文字列 JSON = JsonConvert.SerializeObject(メッセージ)。
                    om.Write(JSON)。
                    s_server.SendMessage(OM、全て、NetDeliveryMethod.ReliableOrdered、0 ); 
                } 
                であれば(フレーム%7 == 0 
                { 
                    フレーム + =2 ; 
                } 
                
                { 
                    フレーム ++ 
                } 
            } 
        }

これは、すべてのすべてのオンラインユーザーソケットポートのために、メソッド内のスレッドです。決意のクライアントを容易にするためにJSONデータ・フォーマット。フレームは、フレームで、プラス毎秒1、そして最終的に私がテストをスキップの便宜のために%7フレーム、つまり、7フレームの倍数に、私のフレームは1、プラス2プラスではなく、クライアントは必要性を決定することができますフレームをスキップ。

 

クライアントのアップデータが1秒60があるので、クライアントを見て、私は1秒10に彼を置きます。同様の

 もし(GameModel.getInstance()レート==。6 
        { 
            GameModel.getInstance()レート = 0 ; 
} GameModel.getInstance()レート ++。

その後、私は、サーバーが10を乗じたフレームに送ってくれ置く;対応。

3つの論理処理クライアントモードでは、通常の動作、フレームスキップを待っている、があります。

クライアントが終了したすべてのフレームを待っているので、サーバーのフレームを使用すると、一時停止を行うことができ、待機するように、この時間は至っていません。

スキップは、サーバとクライアントフレーム枠の差によって決定される10以上です。その後、わずか10内のクライアントとサーバの間のギャップように、そうすぐに繰り返します。

最終結果:データは、サービス側のフレームに続いて、現在のフレームのクライアントである前に、

结尾等待是 我把服务器关了,客户端自然等待了。

最后代码:非常短

    void Update()
    {
        if (FrameBool && GameModel.getInstance().LogicalFrame > 0)
        {
            Frame = GameModel.getInstance().LogicalFrame;
            FrameBool = false;
        }
        if (FrameBool == false)
        {
            OnSetShaderFrame();
        }
    }

    //总负责 战斗 逻辑处理
    public void OnSetShaderFrame()
    {
        if (GameModel.getInstance().Rate == Rate)
        {
            GameModel.getInstance().Rate = 0;

            if (GameModel.getInstance().LogicalFrame == Frame)//帧相同,客户端等待
            {
                Debug.Log("-><color=#E88748>" + Frame + "客户端等待 " + GameModel.getInstance().LogicalFrame + "</color>");
            }
            else
            {
                Debug.Log("-><color=#90E848>" + Frame + "逻辑帧 " + GameModel.getInstance().LogicalFrame + "</color>");
                Frame++;//执行完毕 帧加一

                if (GameModel.getInstance().LogicalFrame - Frame > 7)//超过1秒 ,6帧 一秒
                {
                    for (int i = 0; i < (GameModel.getInstance().LogicalFrame - Frame); i++)//保留当前6帧,其他跳帧
                    {
                        Debug.Log("-><color=#E84848>" + Frame + "跳帧执行 " + GameModel.getInstance().LogicalFrame + "</color>");
                        Frame++;//执行完毕 帧加一
                    }
                }
            }

        }
        GameModel.getInstance().Rate++;
    }

祝大家好运!

おすすめ

転載: www.cnblogs.com/big-zhou/p/11387886.html