トップページ > 過去ログ > 記事閲覧
ネットワークゲームはどう作ればいい?
名前:Dixq 日時: 2009/07/07 21:14

現在LAN内で接続した10台程度のパソコンで、 ボンバー○ンのオンライン対戦ゲームのような物が作れないかと考えています。 DXライブラリの通信関連の関数でそれが出来るでしょうか? 今考えているのは、サーバーとなる端末を一台設定し、皆そこに操作したキャラのデータを送信し、 サーバーとなる端末から各10台へ、 全てのキャラの移動操作を送信するようにすればいいのかなと思っていますが、 1フレームごとに全ての情報が集まり、受け取れるまで次のフレームに移動出来ない仕様で、 60FPSが維持できるのだろうか?という疑問が浮かびました。 どのように制御すべきか、アドバイス頂ければ有り難く思います。 よろしくお願いいたします。

Page: 1 |

Re: ネットワークゲームはどう作ればいい? ( No.1 )
名前:Will 日時:2009/07/08 10:35

長文すいません。 > 全てのキャラの移動操作を送信するようにすればいいのかなと思っていますが、 > 1フレームごとに全ての情報が集まり、受け取れるまで次のフレームに移動出来ない仕様で、 この設計では無理だと思います。 ぱっと考えただけで以下のような問題があります。 1.DXLibはTCP通信なので信頼性はあるが通信オーバヘッドが大きすぎる 2.サーバは各クライアントからのデータ受信もこなしつつ、0.016秒ごとにクライアントに10個のデータを送信する必要があるわけだかそんなことは多分不可能。 3.TCPにしろUDPにしろデータ送信関数を実行しても、直ちに送信される保証はないし到達するまでにどれだけの時間がかかるかも保障してない これはDXLibの仕様ではなくTCPとかUDPの仕様です。 そのため、2の問題がなかったとして、サーバが0.016秒ごとに全クライアントに対してデータ送信することが出来たとしても 時間内にクライアントに到達する保証もないし、各クライアントで受信するまでのタイムラグが異なるので あるクライアントでは60FPSを維持できるけど、あるクライアントでは出来ないということが発生します。 私ならば以下のように設計します。 ・UDPを使用する ・(サーバが全クライアントに送信するデータが同じであるならば)サーバからのデータ配信はマルチキャスト方式を採用する ・サーバ側もクライアント側もデータがきちんと届くことを前提とした作りには絶対しない 主にクライアント側の設計になりますが  データが届くかどうかによらず60FPSで描画する。  届かなかったときは他プレイヤーの動きは前回情報を元にクライアントで補完し、  データが届いたときに修正する。  例えば、右に動こうとしているプレイヤーはそのまま右に動いているように描画し、  データが届いたときに正しい位置に描画しなおす。 ・サーバ−クライアント間で送受信するデータは、各プレイヤーがどういう操作をしたかではなく 今どこにいるかという位置情報にする
Re: ネットワークゲームはどう作ればいい? ( No.2 )
名前:Hima 日時:2009/07/09 02:32

私もネットワークゲームのことがよく知らないですが、この本を買ってました. hxxp://www.amazon.co.jp/14歳からはじめるC言語オンラインゲームプログラミング教室-Windows-XP-Vista対応-有一郎/dp/4899772408 この本はDxLibを使いし、サンプルゲームもぷよ○よオンライン系のゲームですから、きっといいと思いますよ。
Re: ネットワークゲームはどう作ればいい? ( No.3 )
名前:Dixq 日時:2009/07/09 22:44

>Willさん >Himaさん ご回答ありがとうございます。 そうですよね。TCPを使う意味がないですし、socket.hとかの関数で自作した方が早そうですね。 後 >サーバ−クライアント間で送受信するデータは、各プレイヤーがどういう操作をしたか >ではなく今どこにいるかという位置情報にする ということですが、そうなると、爆風に接触して被弾したようなアクションになったはずが、 修正で、被弾していない状態に変更するようなことが起きてくるのでしょうか? また、フレームが飛ぶと、いつ爆弾を置いたか、蹴った、投げたかなど、制御が難しくなるような気がします・・。 この辺詳しく知りたいなら書籍で学んだ方がよさそうですね。 Himaさんがご紹介下さった本も見てみます。ありがとうございました。
Re: ネットワークゲームはどう作ればいい? ( No.4 )
名前:Will 日時:2009/07/10 10:00

> ということですが、そうなると、爆風に接触して被弾したようなアクションになったはずが、 > 修正で、被弾していない状態に変更するようなことが起きてくるのでしょうか? プレイヤーの生死にかかわるような情報はサーバから受信するべきであり、 その判定も各クライアントではなく、サーバで一括管理したほうがスマートと考えます。 そのため、あるクライアントでは他プレイヤーが爆風に触れているのに死なないとか、 逆に触れていないのに死ぬとかいう状況が発生する可能性はあります。 (市販ネットゲーでも重い時間帯だと他プレイヤーの瞬間移動などは発生しますよね) この辺はクライアント側での補正の仕方によりますので プログラマーの腕の見せ所ですね。 > フレームが飛ぶと、いつ爆弾を置いたか、蹴った、投げたかなど、制御が難しくなるような気がします・・。 PC単体ソフトの場合、フレーム処理をベースにした設計は問題ないと思いますが ネットゲーでは、通信データの送受信というところから設計を考えていかないと 難しくなると思います。 まず、サーバとクライアントでの機能分担とか通信データの内容とかを設計し クライアントでの描画設計はそれからだと思います。
Re: ネットワークゲームはどう作ればいい? ( No.5 )
名前:Dixq 日時:2009/07/14 21:09

Willさん、引き続きご回答ありがとうございます。 なるほど、いくらなんでも生き返るのはおかしいですもんね。 う〜ん、制御は難しいところですね〜・・。 そして確かに重い時間帯、オンラインゲームしていると瞬間移動している人とかいますね。 オンラインゲームだと、オフラインゲームより格段に制御が難しそうですね。 制御とフレーム、その関係をよく考えて見たいと思います。 ご回答ありがとうございました。
Re: ネットワークゲームはどう作ればいい? ( No.6 )
名前:yama 日時:2009/07/17 16:22

参考になるか分かりませんが 僕がいつもやってるリアルタイムのオンラインゲーム(格ゲー)は、パソコンごとに決められたdelayという値があって、入力した時点からゲームに反映するまでに若干のラグがあります。 ラグと言ってもだいたい1フレームから6フレームぐらいですが、ほとんど気づきません。 あと、キーを送信するピッチを設定することができます。普通は1フレーム1パケットですが、2フレームごとに1パケットとか、3フレームに1パケットとか。 ピッチが速いと快適ですが、pingが大きいと逆にカクカクすることもあります。 ピッチが遅いと処理落ちみたいな挙動はしませんが、なんだかぬるっとした操作感で、細かい操作ができない気がします。(これもすぐ慣れる) でもレースやぷよぷよはリアルタイム性より操作性重視な気がしますね。 瞬間移動もよくあるし。
Re: ネットワークゲームはどう作ればいい? ( No.7 )
名前:Dixq 日時:2009/07/21 20:10

>yamaさん ご回答ありがとうございます。 なるほど、delayという手があるのですね。 その辺のフレームの設定は試行錯誤で調整してみたいと思います。 貴重なご意見ありがとうございます。

Page: 1 |