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
なるほど、参考にさせていただきます
ありがとうございました
|