トップページ > 記事閲覧
DXライブラリ上でのオンライン化のサンプルソースを頂きたい
名前:乞食 日時: 2015/05/26 21:39

無理なお願いだと承知の上ですが、DXライブラリを利用したオンラインゲームのサンプルプログラムを頂けないでしょうか。 基本的なことだけで構わないので、どのような設計でどのような通信を行えばいいのかを教えて頂きたいです。 今私はDXライブラリを使った対戦FPSのようなものを作ろうとしています。が、オンライン化にあたって、様々な問題に直面しています。 遅延や同期に関する問題がその最たるもので、調べてもソースはおろかはっきりとした解決法もわかりませんでした (つまりさまざまな手法が出回っているということなのでしょうが、何が向いているかなどを判断する知識を持ち合わせていないので) またキー入力をイベントで扱うとオンライン化しやすいと耳にしたのですが、ループごとにキー入力を取得するDXライブラリでのゲームプログラミングでは勝手が違い、そのような実装は難しいと思われます。 フレーム単位でのキー入力の実装では処理落ちなどで他マシンとのフレームレートがズレた時に、予期しない挙動をしてしまうと思われます。 このような問題をどのように解決するべきか、指南いただきたいのです。 もちろん対戦FPSのソースを丸々くれなどと大それたことはお願いできませんので(オリジナリティも無くなりますしね) 単純な2Dアクション、あるいは早押しゲームのようなものでも構いません、オンラインゲームの構造を教えていただきたいです。 ただし、現在のサンプルプログラムのページにあるチャットプログラムのようにただメッセージを送りあうものでなく、同期を考慮したものを希望します。 DXライブラリには多岐にわたる機能や丁寧なサポートで非常にお世話になっており、他ライブラリに乗り換えることは考えられません。 無茶な話とは思いますが、検討いただけたら幸いです。
メンテ

Page: 1 |

Re: DXライブラリ上でのオンライン化のサンプルソースを頂きたい ( No.1 )
名前:管理人 日時:2015/05/28 02:06

すみません、リアルタイム性の高いオンラインゲームは作成したことがないので サンプルプログラムを作成することはできません 今まで見聞きしたり、自分が作ることになったらこうするだろうな、というようなお話になってしまいますが もし1対1の対戦FPSでしたら、お互いに各フレームで入力したキー情報を送りあうだけで済みます フレームレートは60FPSや30FPSなどで固定して、片方が処理落ちしたらもう片方もそれに合わせて処理落ちさせます ( というか処理が追いつくまで待ちます ) この方式の場合お互いの入力キーの情報が届くまでの時間がそのままラグの大きさになりますが、実装は一番簡単です もし二人以上が参加する対戦FPSの場合でしたら、前述の入力キーを送り合う方式でもいけないことはないですが、 通信量が大きくなりラグも大きくなるので人数が増えれば増えるほど現実的ではなくなります なので、入力キーを送りあうのではなくプレイヤーキャラクターの状態( 座標・向き・移動速度・姿勢などなど )を定期的に( 毎フレームではなく )送り合い、 重要なアクション( 主に銃を撃った、弾が当たったなどでしょうか )は発生した直後に送るようにして、 入力キーを毎フレーム送るより通信量を少なくします プレーヤーキャラクターの状態を決定する毎フレームのキー情報が無いので、情報が送られてこない間の 数フレーム〜数十フレームの間はそれまでの情報を元にプログラムで動きを補間します 動きが補間されている状態の相手を撃ち倒した場合、正確な位置では弾が当たっていないかもしれないので、 弾が当たったら通信を行い、本当に打ち倒した座標に相手がいたかどうかを確認します 毎フレーム情報を送りあうわけではないので、同期の方法は通信で送る情報に時間を添えて、情報を受け取った方は 情報に付属している時間を元に補間の具合や判定などの処理を行います と、こんな感じですが、実際にこのようなゲームを作ったことがあるわけではなく作ったことがある方にお聞きしたり どこかで見たような情報からの想像だったりしますので、正しくないかもしれません 通信量とラグが一番の問題なので、「見えない位置にいる相手、遠くにいる相手との通信頻度は下げる」や逆に 「近接戦闘している相手とは頻繁に通信する」などのことも聞いたことがあります FPSは対戦格闘ゲームほど相手の動きを厳密に再現しなくてもあまり支障がないので色々誤魔化が効く、ということも聞いたことがあります 入力キーを送りあう前者の方式と、イベント情報を送りあう後者の方式とではかなり実装の仕方が異なり、 概ね後者の方式の方が難易度が高いようです
メンテ
Re: DXライブラリ上でのオンライ ( No.2 )
名前:乞食 日時:2015/05/28 13:13

私が作るのは二人対戦ではないので、実装は後者になりそうです。 通信のレイテンシ対策の視点からも優秀だと思いました。 補完についてはいろいろ調べてみることにします。 話は変わりますが、DXライブラリでの通信処理や移動計算、描画処理をマルチスレッドで行うのは、 マルチスレッドから切り離す事を目的とするDXライブラリの設計理念では難しいでしょうか? 代替の機能等ございましたらご教授ください。
メンテ
Re: DXライブラリ上でのオンライン化のサンプルソースを頂きたい ( No.3 )
名前:管理人 日時:2015/05/30 01:33

通信処理は別スレッドにすることは可能です ただ、その場合はDXライブラリの通信機能ではなく WinSock を直接使用した方が良いと思います ( DXライブラリの通信機能は WinSock をほぼそのまま使用しているので WinSock を使用するのは難しくありません ) DXライブラリが対応していないのは「複数のスレッドからDXライブラリの関数を呼ぶ( DxLib_Init を呼んだ スレッド以外のスレッドからDXライブラリの関数を呼ぶ )」ことなので、移動計算も DXライブラリの関数を呼ぶ必要がない部分は別スレッドにすることが可能です DXライブラリの関数を呼ぶスレッドが複数になることには対応していないので、描画処理を別スレッドに 切り離すことはできません
メンテ
Re: DXライブラリ上でのオンライ ( No.4 )
名前:乞食(解決) 日時:2015/05/30 17:28

なるほど、参考にさせていただきます ありがとうございました
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存