No.2ベストアンサー
- 回答日時:
CEDEC2010で、セガの人がまさにその質問のパターンの通信対戦型格闘ゲームについて講演をしていました。
ここで解説されているのは、最初から、プレイヤーの入力が画面に反映されるまで(ネットワーク遅延分だけ)わざと遅延させる手法です。ごまかしというよりも、遅延の影響を最小限に抑えつつ公平なゲーム内容にするには、こういう形にならざるを得ないということでしょう。
2~3フレームというと 30~50msecですが、日本国内の状態の良い回線同士ならば、なんとかこの範囲に収まるのではないかと思います。海外だときついでしょう。
参考URL:http://www.4gamer.net/games/105/G010549/20100905 …
参考URLが本当に参考になりました!
UDPで送りつつ、パケットロス対策で過去のフレーム分も載せちゃうなんて
考えてもみませんでした。
基本的にはキー入力をストリーミング情報として扱う感じで、
でも音声ストリーミングのように大容量のバッファリングをさせず
数フレーム分のバッファリングで捌いてくのですね。
自分なりに理解できたと思います。
ありがとうございます。
No.3
- 回答日時:
私の知識内で簡単に回答します。
>例えば60FPSで動作する格闘ゲームでは、1/60秒に一度キー入力を受け付けて
>画面を更新しますよね?
キー入力と言っても、1/60秒間だけキーを押している訳ではないですよね。
一般的には0.1秒感覚でON/OFF出来れば速いほうだと思います。
そもそも、1/60秒だとチャタリングと区別がつかない場合もあります。
したがって、「 キーのON/OFFは最低でも0.1秒間キーをONにしておかなければ有効としない 」
と、すれば良いのではないでしょうか?
また、1/60秒毎にコマンド入力判定を行っているとは限りません。
60FPSというのは、描画速度での話です。
> しかし、実際には1/60秒以内に相手からパケットをもらえる環境など
1/60秒単位でのやり取りはそれ程厳しい環境ではないですよ。
P2Pなら尚更です。
とはいえ、常にベストな状態が維持できるとは限らないので現状では100ms
ぐらいを想定して設計される事が多いのではないでしょうか?
>もちろん入力がないフレームは送受信要らないと思いますが、例えば
普通は、入力がなくても「入力が無い」というデータを送受信をしています。
でないと、同期が取れなくなります。
>xフレーム目にユーザ1がガードを行い、x+1フレーム目にユーザ2がパンチを入力した際、
>xフレーム目のガード入力がx+1フレーム目の処理までにユーザ2に到達する必要がありますよね?
この理屈だと、1/60秒でパンチがヒットする事になりませんか?
通常、コマンド入力からヒットまで速くて0.2~0.5秒ぐらいではないでしょうか?
それで無ければ、モーションを見てガードやカウンターが不可能ですよね。
例えば、
人間の反応速度を考えると、コマンド入力完了から0.1秒後に技が発動しても
遅れているとは感じにくい(個人差はあるにしろ)
人間のキー入力時間は速くても0.1秒
ヒットの判定までに、最速でも0.2秒
コマンド入力は2フレーム毎に見る。
と、した条件を盛り込むとします。
それならば、100ms単位で同期をとって処理を行えば、それ程問題なくゲームが進行していきます。
(フレーム単位での同期が行いたいなら6フレーム程度での同期を行う)
これでも、タイミングにより若干の問題が(ガードが間に合うはずなのにヒットした等)
発生するのですが、0.1sec単位では人間に知覚されづらいので余り問題にならないのです。
と、ここまで書いている間に、No.2さんが リンク付きで回答がありましたね。
このリンク先の説明で概ね解決するのでは無いかと思います。
回答ありがとうございます。
> この理屈だと、1/60秒でパンチがヒットする事になりませんか?
スーファミのストIIとかだと、弱パンチの繰り出しモーションとかなくて
いきなりあたり判定だったような記憶があったので。
そのようなケースを想定したのですが、記憶違いかもしれませんね。
6フレーム(=100msec)程度であれば問題にならないということですね。
たしかに100msec程度の遅延は僕には気付けない世界だと思います。
一つ疑問が解決しました。
ありがとうございます。
No.1
- 回答日時:
>これが通信対戦となると、1/60秒に一度自分のキー入力を相手に送信して
相手のキー入力を受信して画面更新しないと、正しく動かないと思うのです。
そうでしょうか?
どういう動きを開始したか(技の開始、歩き始めた、ガード始めた等)
ガードした
食らった
後は、定期的に、自分の座標と自分の体力ゲージの値を送り
相手の座標と相手の体力ゲージの値をもらう
両方の座標がわかっていれば空振りなのもわかるし
1/60秒毎に送信するタイミングはあるでしょうが
基本動作の開始時さえ分かればよいので、
1/60秒毎常にデータを送っている訳では無いと思いますよ
この回答への補足
回答ありがとうございます。
もちろん入力がないフレームは送受信要らないと思いますが、例えば
xフレーム目にユーザ1がガードを行い、x+1フレーム目にユーザ2がパンチを入力した際、
xフレーム目のガード入力がx+1フレーム目の処理までにユーザ2に到達する必要がありますよね?
そうでないとユーザ2側の画面ではパンチがヒットしてしまう。
ということは、ユーザ2側ではxフレーム目でのガードの有無を受信しないと
x+1フレーム目の描画ができません。
そこで画面が止まってしまうのはマズイと思うのですが…
(上記はユーザ1とユーザ2のキャラクタが密着しているものとします)
根本的に考え方が間違ってるはずなんですが、正解がなんなのかわからないのです。
No2さんの参考URLを見て、やっとnak777r様の言っていることが
やっと理解できました。
理解力が足りなくって申し訳ないです。
> 1/60秒毎常にデータを送っている訳では無いと思いますよ
これについては回答者様によって意見が異なるようですが、おそらく
どちらでも実装可能そうですね。
信頼性を取るか、パフォーマンスを取るかみたいな話になるのかな、と
思います。
色々勉強になりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 運転免許・教習所 対面する車用信号機の両隣の歩行者用信号を車用信号の変化予測に使うことは出来ますか? 1 2023/03/12 11:50
- ガラケー・PHS SMSメールの受信遅延原因はガラケー自体の欠陥では 8 2022/08/06 11:46
- Outlook(アウトルック) PCで登録途中の画面から認証コードを確認する方法を教えてください。 3 2022/09/29 06:11
- docomo(ドコモ) 通話録音が(最初から)自動的に始まるアプリは? 7 2023/01/16 15:53
- Visual Basic(VBA) VBA Twitter 高度な検索 日付 単語 リンクをOutlook で送信 2 2022/06/18 18:36
- 物理学 再会しない双子のパラドックス。 5 2023/01/16 11:21
- 運転免許・教習所 真剣に信号待ちをして青になった瞬間素早く発進しても遅い遅いと文句を言う同乗者とどう折り合いを付ければ 11 2022/11/30 10:59
- Google+ ブランド品偽物サイトからのメールを拒否する方法 批判覚悟で投稿します。 とあるサイトからブランド品を 2 2023/01/11 21:49
- マウス・キーボード 不良表示キー(キーボード) 3 2022/04/27 10:53
- Windows 95・98 Windows11にバージョン アップしました。 2 2023/07/21 18:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
scanfが2回使えない・・・?;
-
Linuxで入力待ちなしkeyread関...
-
if文の条件にscanf関数を使うと…?
-
scanf が無視されます
-
scanf関数 バッファに残ったエ...
-
java初心者です。入力されたの...
-
scanf("%s", buf);でスペースを...
-
Eclipseコンソール表示を、リセ...
-
double型が正常に認識されてい...
-
入力エラーの処理について。
-
【C言語】入力された文字種別ご...
-
少数部の判定
-
fgetsとループ処理
-
C言語scanf_sで何故か2回入力に...
-
Userformの入力順序をタブオー...
-
enterでループ終了
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
double型が正常に認識されてい...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
C言語について。
-
batプログラム上で文字列を入力...
-
*をユーザーが入力した数字の数...
-
cout関数を使っているのですが...
-
漢字のソートについて
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
ワードで文字を入力する時の変...
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
EDITコントロールで入力できる...
-
Eclipseコンソール表示を、リセ...
-
小数か整数かを判定する方法
-
C言語scanf_sで何故か2回入力に...
-
VB.NETで16進数+16進数や16進...
-
Linuxプログラミングで、キーボ...
おすすめ情報