いつもお世話になっております。山崎です。
今回は、DXライブラリの通信の機能を使った場合の通信速度などについて、
伺いに参りました。
XPでVisualStudio2010を使ってます。
ただいま、ネット対戦可能な格闘ゲームを作ろうと模索しており、
その通信を司る部分を今作っています。
そこで、次の処理を行って簡単に通信にかかる時間を計ってみました。
なお、60fpsで動いてますので1フレームで大体0.016ミリ秒かかってます。
自分をA、接続相手をBとしたとき、
1、あるデータをBに送信する
2、そのデータを受け取ったBは、受け取ったデータをそのままAに送信し返す
3、Aはデータを送信してから返ってくるまでのフレーム数を求める
ネットの知り合いに頼んでこのプログラムのテストに付き合って頂き
データを送ってから戻ってくるまでのフレーム数を測ったところ、
大体4~6フレームかかっておりました。
同期をするためのカウントと、コントローラの入力を毎フレームやり取りしあうような
通信部分にしようと考えています。
相手からのデータが届くのを待つのに2~3フレームかかるとすると、
ゲームの進行速度は半分から3分の1になってしまい、
1フレームの入力が勝敗を分ける格闘ゲームは
ゆっくり過ぎてゲームにならなくなるのではないか、と懸念しております。
DXライブラリを使って通信しあうプログラムでは、
送受信に2~3フレームかかるのは仕方のないことなのでしょうか?
格闘ゲームを60fpsで動かそうとするのは無謀なのでしょうか。
DXライブラリを使った通信の速度などについて
Re:DXライブラリを使った通信の速度などについて
>DXライブラリを使って通信しあうプログラムでは、
>送受信に2~3フレームかかるのは仕方のないことなのでしょうか?
DXライブラリじゃなくても仕方がないです。
ネットワークとはそういうものです。
2~3フレームというのも環境によって変動しますし、環境が同じなら一定と
いうこともありません。
なので多少ラグがあっても大丈夫なように設計するしかありませんね。
>格闘ゲームを60fpsで動かそうとするのは無謀なのでしょうか。
そこに十分な時間がかけられるなら無謀ということはないです。
簡単にはいかないでしょうが、同期するタイミングをXフレームおきにし、
データが来ない間は推測して動かして、データが来たらつじつまを合わせる、
とかやりようはありますので。
>送受信に2~3フレームかかるのは仕方のないことなのでしょうか?
DXライブラリじゃなくても仕方がないです。
ネットワークとはそういうものです。
2~3フレームというのも環境によって変動しますし、環境が同じなら一定と
いうこともありません。
なので多少ラグがあっても大丈夫なように設計するしかありませんね。
>格闘ゲームを60fpsで動かそうとするのは無謀なのでしょうか。
そこに十分な時間がかけられるなら無謀ということはないです。
簡単にはいかないでしょうが、同期するタイミングをXフレームおきにし、
データが来ない間は推測して動かして、データが来たらつじつまを合わせる、
とかやりようはありますので。
Re:DXライブラリを使った通信の速度などについて
毎フレーム入力状態を得ようとしてたら、おっしゃるとおり全体が遅くなって格闘ゲームには不向きでしょう。
でも、そもそも待つ必要はあるんでしょうか?
データがこない間は前の入力状態を継続すればOKです。(つまりホスト側がかなり有利になります。)
つまり、60fpsにできます。
ホスト側が有利になるのがいやであれば、自分の入力情報の更新を対戦相手の入力を受信した時のみにすればある程度平等になるんじゃないでしょうか。
(あるいはホストサーバーを作るか。)
でも、そもそも待つ必要はあるんでしょうか?
データがこない間は前の入力状態を継続すればOKです。(つまりホスト側がかなり有利になります。)
つまり、60fpsにできます。
ホスト側が有利になるのがいやであれば、自分の入力情報の更新を対戦相手の入力を受信した時のみにすればある程度平等になるんじゃないでしょうか。
(あるいはホストサーバーを作るか。)

Re:DXライブラリを使った通信の速度などについて
Justyさん
ご返信、誠にありがとうございます。
どうしてもラグは避けられないものなのですね。
データが来ない間は推測…ですか、そういう手法もあるんですね。
いやいや、非常に勉強になりました。
Maさん
ご返信誠にありがとうございます。
なるほど、データの来ない間は前の入力状態を継続させる、のですね。
今私の作ろうとしている設計には当てはまるかもしれません、
その手法でとりあえずやらせて頂きますね。
1フレームでも入力を早く受け付けるとおそらく格闘ゲームではかなり有利になると思うので、
おっしゃるように受信したときに処理するようにしてみます。
ところで、「ホストサーバ」とは、どういったものかちょっと聞かせて頂いてもよろしいですか?
ご返信、誠にありがとうございます。
どうしてもラグは避けられないものなのですね。
データが来ない間は推測…ですか、そういう手法もあるんですね。
いやいや、非常に勉強になりました。
Maさん
ご返信誠にありがとうございます。
なるほど、データの来ない間は前の入力状態を継続させる、のですね。
今私の作ろうとしている設計には当てはまるかもしれません、
その手法でとりあえずやらせて頂きますね。
1フレームでも入力を早く受け付けるとおそらく格闘ゲームではかなり有利になると思うので、
おっしゃるように受信したときに処理するようにしてみます。
ところで、「ホストサーバ」とは、どういったものかちょっと聞かせて頂いてもよろしいですか?
Re:DXライブラリを使った通信の速度などについて
DXライブラリじゃなくても、インターネットを使った通信の場合はパケットの遅延は当たり前に起こります。
メーカー製の格闘ゲームの通信をパケットキャブチャしてみると良い勉強になると思いますが、推測でどのようなことをしているか書いてみると、メインの通信は非同期通信を使っていると思います。同期型の通信は、ゲームの場合遅延が相当ネックになります。それと相手との双方向に情報を送り合うと言うよりは、一方的に必要な情報を相手に送信していると言うイメージかなと。パケットを送って返事を待つ時間がすごいロスですからね。
コマンドや当たり判定もそのまま送るのではなく、少ない情報で済むように加工していると思います。
ここら辺はノウハウの塊と言っても良いので、かなり経験を必要とします。
プロトコル的に有利なUDPを使っているという話も聞いたことがありますが、パケットロストをどうしているかネットワークゲームを組んだことが無いので適当な話ですいません。
この本が参考になるかと。
http://www.amazon.co.jp/dp/4797328460
※ サーバーの参考にはならない本みたいです。
>ところで、「ホストサーバ」とは、どういったものかちょっと聞かせて頂いてもよろしいですか?
ホストサーバには色々ありますが、Maさんの言う方法はゲームの進行というか当たり判定も含めてホストサーバーが行うイメージだと思います。つまり仮想的な対戦システムはサーバー上に有り、パソコンは画の表示とキーの入力を行うシステムだけを搭載しているイメージです。これはサーバー側の負荷がとても大きです。
PC(A)⇔サーバー⇔PC(B)
ですね。
メーカー製の格闘ゲームの通信をパケットキャブチャしてみると良い勉強になると思いますが、推測でどのようなことをしているか書いてみると、メインの通信は非同期通信を使っていると思います。同期型の通信は、ゲームの場合遅延が相当ネックになります。それと相手との双方向に情報を送り合うと言うよりは、一方的に必要な情報を相手に送信していると言うイメージかなと。パケットを送って返事を待つ時間がすごいロスですからね。
コマンドや当たり判定もそのまま送るのではなく、少ない情報で済むように加工していると思います。
ここら辺はノウハウの塊と言っても良いので、かなり経験を必要とします。
プロトコル的に有利なUDPを使っているという話も聞いたことがありますが、パケットロストをどうしているかネットワークゲームを組んだことが無いので適当な話ですいません。
この本が参考になるかと。
http://www.amazon.co.jp/dp/4797328460
※ サーバーの参考にはならない本みたいです。
>ところで、「ホストサーバ」とは、どういったものかちょっと聞かせて頂いてもよろしいですか?
ホストサーバには色々ありますが、Maさんの言う方法はゲームの進行というか当たり判定も含めてホストサーバーが行うイメージだと思います。つまり仮想的な対戦システムはサーバー上に有り、パソコンは画の表示とキーの入力を行うシステムだけを搭載しているイメージです。これはサーバー側の負荷がとても大きです。
PC(A)⇔サーバー⇔PC(B)
ですね。
Re:DXライブラリを使った通信の速度などについて
softyaさん
ご返信誠にありがとうございます。
メーカー製のは非同期通信が多いのですか。
うーん、てっきり、同期して矛盾がないように気を配っているものとばかり思っていました。
いやぁ、ホント勉強になります。
VBを使ったネットワークゲームなら組んだことがあるのですが、
C++を使って通信をするプログラムは初めてなので、経験をつんでいこうと思います。
あ、その本は、ちょうど昨日 本屋で立ち読みしてた奴です~!(笑)
サーバに関する技術書を探し回っておりました。
パラパラッと読んですぐに置いてしまったので、ちゃんと読み直しますかな…。
ホストサーバ…主な処理をサーバで行っちゃうんですね。
いいパソコンを私は持ってないので、そのシステムだとサーバの負荷に耐えられないですかも。
いろいろ丁寧にお教え頂き、ありがとうございました。
ご返信誠にありがとうございます。
メーカー製のは非同期通信が多いのですか。
うーん、てっきり、同期して矛盾がないように気を配っているものとばかり思っていました。
いやぁ、ホント勉強になります。
VBを使ったネットワークゲームなら組んだことがあるのですが、
C++を使って通信をするプログラムは初めてなので、経験をつんでいこうと思います。
あ、その本は、ちょうど昨日 本屋で立ち読みしてた奴です~!(笑)
サーバに関する技術書を探し回っておりました。
パラパラッと読んですぐに置いてしまったので、ちゃんと読み直しますかな…。
ホストサーバ…主な処理をサーバで行っちゃうんですね。
いいパソコンを私は持ってないので、そのシステムだとサーバの負荷に耐えられないですかも。
いろいろ丁寧にお教え頂き、ありがとうございました。
Re:DXライブラリを使った通信の速度などについて
解決となっていますが……。
MicrosoftのXbox360およびWindowsで使用可能なXNAではUDPを使っています。
XNA自体の通信系はXbox360そのもののはずですから,Liveネットワーク自体UDPで動作しているはずです。
使っているのがXNAではないにしろ,ひにけにXNA (XNA開発チーム伊藤さんのBlog) の記事は参考になるのではないでしょうか。
Blog: Browse by Tags - ひにけにXNA - Site Home - MSDN Blogs
http://blogs.msdn.com/b/ito/archive/tag ... fc30af30_/
# 「タグ:ネットワーク」の一覧です。
あと,XNA Forumでのひげねこさん (伊藤さん) の回答の付いたスレッドです。
こちらには,ひげねこさんがいくつか方法を提示してくれています。
Site: ネットワーク対戦 - XNA Community Forums
http://forums.xna.com/forums/t/38945.aspx
MicrosoftのXbox360およびWindowsで使用可能なXNAではUDPを使っています。
XNA自体の通信系はXbox360そのもののはずですから,Liveネットワーク自体UDPで動作しているはずです。
使っているのがXNAではないにしろ,ひにけにXNA (XNA開発チーム伊藤さんのBlog) の記事は参考になるのではないでしょうか。
Blog: Browse by Tags - ひにけにXNA - Site Home - MSDN Blogs
http://blogs.msdn.com/b/ito/archive/tag ... fc30af30_/
# 「タグ:ネットワーク」の一覧です。
あと,XNA Forumでのひげねこさん (伊藤さん) の回答の付いたスレッドです。
こちらには,ひげねこさんがいくつか方法を提示してくれています。
Site: ネットワーク対戦 - XNA Community Forums
http://forums.xna.com/forums/t/38945.aspx
Re:DXライブラリを使った通信の速度などについて
YuOさん、ご返信誠にありがとうございます。
解決はつけておりますが、もちろん常に回答受付中ですのでっ!
いやぁ貴重な情報ありがとうございます。
こういうコラム的な記事をこれから読まなきゃなぁと思っていたところなのでした。
私も、こんなコラムをかけるくらいの技術者にならなければ。
紹介していただいたサイト、お気に入りに登録させて頂きました。
どうもありがとうございました。
解決はつけておりますが、もちろん常に回答受付中ですのでっ!
いやぁ貴重な情報ありがとうございます。
こういうコラム的な記事をこれから読まなきゃなぁと思っていたところなのでした。
私も、こんなコラムをかけるくらいの技術者にならなければ。
紹介していただいたサイト、お気に入りに登録させて頂きました。
どうもありがとうございました。