多くのオンライン同期方式がありますが、私はカップルが読み取ることができない、あまりにも面倒を見て、古い見ていません。だから私は単純にクイックスタートを容易にするため、について書きました。
実行する前に、サーバは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++; }
祝大家好运!