トップページ > 過去ログ > 記事閲覧
通信:UDP通信開始の同期をとりたい
名前:hiryuh 日時: 2012/02/11 04:46

お久しぶりです。GRCのhiryuhです。 現在、通信で対戦できるパズルゲームを作っています。 ところが、うまく同期をとることができずに困っています。 ▼環境 ・UDPで通信しているので、PC2台でテストしています。 ・一台は無線LANで接続していますが、お互いにpingは32バイト1msで通ります。 ▼やりたいこと ・TCPで乱数をシェア、開始を同期。(1つの実行ファイルでで親と子を処理。親は親処理をしつつ小処理で自分自身に接続する。) ・UDPでキーデータを毎フレーム相手に送る。 ・実際のゲームを数フレーム送らせてバッファリング。 ・過去フレームのデータを一緒に転送してパケロスしたときは次のフレームデータからフレームデータを収集する。 ▼問題点 ・TCPで親になった方のプレイヤーがゲーム開始から数フレーム相手のデータを受け取れません。 →子になったプレイヤーは最初のフレームからデータを受け取れます。 →子になったプレイヤーのみ、シーンの遷移時に100ms近く処理落ちしてしまいます。 →その分、親のほうが先にゲーム開始してしまうということだと思っています。 →ProcessMessage()の中のネットワーク処理が怪しい気がしています。 ▼余談 NetWorkRecvの関数に 30ms近くかかることがあるようです。 可能でしたら、非同期に通信処理を行うようにしていただけませんでしょうか? また、こちらは特に大きな問題にはなっていませんが、 最初に PreparationListenNetWork か MakeUDPSocket を呼ぶと、 関数を抜けるまでに 50ms前後経過してしまいます。 以上になります。 何か解決策などいただけると嬉しいです。 よろしくお願い致します。

Page: 1 |

Re: 通信:UDP通信開始の同期をとりたい ( No.1 )
名前:管理人 日時:2012/02/13 01:45

お久しぶりです すいません、載せて頂いた情報だけでは「何か重い処理が走っているのかも・・・」くらいにしか推測できません ゲーム開始から数フレーム相手のデータを受け取れないとのことですが、 子が数フレーム待ては同期は取れて問題解決、というわけではないのでしょうか? > NetWorkRecvの関数に 30ms近くかかることがあるようです。 > 可能でしたら、非同期に通信処理を行うようにしていただけませんでしょうか? 少し作業が必要なので直ぐに対応というのは難しいです・・・ 一応理想的ではないですが定期的に通信処理を行う処理を追加したものをアップしましたので、 よろしければお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) > また、こちらは特に大きな問題にはなっていませんが、 > 最初に PreparationListenNetWork か MakeUDPSocket を呼ぶと、 > 関数を抜けるまでに 50ms前後経過してしまいます。 通信処理はグラフィックやサウンド程使用される確率が高くないので通信関係の関数が最初に呼ばれた時に 初期化処理を行っています、恐らく 50ms はその初期化処理に因るものだと思います DxLib_Init の直後に IPDATA TempIP ; GetMyIPAddress( &TempIP ) ; という記述を増やすと、GetMyIPAddress を実行する際に通信関係の初期化が行われますので PreparationListenNetWork や MakeUDPSocket を呼んだ際の重さは解消できると思います
Re: 通信:UDP通信開始の同期をとりたい ( No.2 )
名前:hiryuh 日時:2012/02/19 08:23

返信遅れてすみません。 対応ありがとうございます! 情報が少なくてすみません。 ・非同期版 →UDPの方も対応してくださっていそうだったので、UDPで試してみましたが、  受信、送信の途中で20ms近く待たされてしまうことが頻繁にあります。 →キーフレーム同期を行いたいので、これは致命的です。 →特に急ぎではありませんので、非同期処理にしていただけると嬉しいです。 ・TestVerでビルドしたところ SetEmulation320x240( true ); が効かなくなってしまいました。 この関数を呼ぶと、画面サイズ自体がが320x240にかわってしまいます。 ・開始の同期 →管理人さんの仰るとおり最初に相手のデータを受け取るまで待つようにして解決しました。 →ただ、通信処理以外は10ms以上かかるような処理はないはずです。 →あまり調査が進められておらず、これぐらいのことしか言えません。すみません。 →とりあえず問題は解消できたので、この件については「解決」とさせていただきます。 →アドバイスありがとうございました!
Re: 通信:UDP通信開始の同期をとりたい ( No.3 )
名前:管理人 日時:2012/03/11 02:45

すみません、見落としていました > ・非同期版 > →UDPの方も対応してくださっていそうだったので、UDPで試してみましたが、 >  受信、送信の途中で20ms近く待たされてしまうことが頻繁にあります。 > →キーフレーム同期を行いたいので、これは致命的です。 > →特に急ぎではありませんので、非同期処理にしていただけると嬉しいです。 非同期処理化を予定に入れましたが、かなり先になる可能性がありますので 直接 WinSock を使用した方が良いかもしれません・・・ ( 通信関係は他の機能に比べてライブラリでやっていることは多くないので  直接使用する方式にするのは簡単だと思います ) > ・TestVerでビルドしたところ > SetEmulation320x240( true ); > が効かなくなってしまいました。 > この関数を呼ぶと、画面サイズ自体がが320x240にかわってしまいます。 DirectX9版ではハードウエアレベルで 320x240 という解像度にすることが できないので、間違ってもモニタに送られる信号が 320x240 になることはないと思うのですが、 画面サイズ自体が320x240になってしまったとは何で判断されたのでしょうか?

Page: 1 |