プロが教えるわが家の防犯対策術!

例えば60FPSで動作する格闘ゲームでは、1/60秒に一度キー入力を受け付けて
画面を更新しますよね?

これが通信対戦となると、1/60秒に一度自分のキー入力を相手に送信して
相手のキー入力を受信して画面更新しないと、正しく動かないと思うのです。

しかし、実際には1/60秒以内に相手からパケットをもらえる環境など
想定してたらまともに動かないとも思います。

何かごまかし方があるんじゃないかと思うんですが、そういったアルゴリズムについて
キーワードでもいいので何か教えて頂けないでしょうか。

A 回答 (3件)

CEDEC2010で、セガの人がまさにその質問のパターンの通信対戦型格闘ゲームについて講演をしていました。


ここで解説されているのは、最初から、プレイヤーの入力が画面に反映されるまで(ネットワーク遅延分だけ)わざと遅延させる手法です。ごまかしというよりも、遅延の影響を最小限に抑えつつ公平なゲーム内容にするには、こういう形にならざるを得ないということでしょう。
2~3フレームというと 30~50msecですが、日本国内の状態の良い回線同士ならば、なんとかこの範囲に収まるのではないかと思います。海外だときついでしょう。

参考URL:http://www.4gamer.net/games/105/G010549/20100905 …
    • good
    • 0
この回答へのお礼

参考URLが本当に参考になりました!
UDPで送りつつ、パケットロス対策で過去のフレーム分も載せちゃうなんて
考えてもみませんでした。

基本的にはキー入力をストリーミング情報として扱う感じで、
でも音声ストリーミングのように大容量のバッファリングをさせず
数フレーム分のバッファリングで捌いてくのですね。

自分なりに理解できたと思います。
ありがとうございます。

お礼日時:2011/02/18 13:02

私の知識内で簡単に回答します。



>例えば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さんが リンク付きで回答がありましたね。
このリンク先の説明で概ね解決するのでは無いかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

> この理屈だと、1/60秒でパンチがヒットする事になりませんか?

スーファミのストIIとかだと、弱パンチの繰り出しモーションとかなくて
いきなりあたり判定だったような記憶があったので。
そのようなケースを想定したのですが、記憶違いかもしれませんね。

6フレーム(=100msec)程度であれば問題にならないということですね。
たしかに100msec程度の遅延は僕には気付けない世界だと思います。
一つ疑問が解決しました。
ありがとうございます。

お礼日時:2011/02/18 12:59

>これが通信対戦となると、1/60秒に一度自分のキー入力を相手に送信して


相手のキー入力を受信して画面更新しないと、正しく動かないと思うのです。

そうでしょうか?
どういう動きを開始したか(技の開始、歩き始めた、ガード始めた等)
ガードした
食らった
後は、定期的に、自分の座標と自分の体力ゲージの値を送り
相手の座標と相手の体力ゲージの値をもらう
両方の座標がわかっていれば空振りなのもわかるし

1/60秒毎に送信するタイミングはあるでしょうが
基本動作の開始時さえ分かればよいので、
1/60秒毎常にデータを送っている訳では無いと思いますよ

この回答への補足

回答ありがとうございます。
もちろん入力がないフレームは送受信要らないと思いますが、例えば
xフレーム目にユーザ1がガードを行い、x+1フレーム目にユーザ2がパンチを入力した際、
xフレーム目のガード入力がx+1フレーム目の処理までにユーザ2に到達する必要がありますよね?
そうでないとユーザ2側の画面ではパンチがヒットしてしまう。
ということは、ユーザ2側ではxフレーム目でのガードの有無を受信しないと
x+1フレーム目の描画ができません。

そこで画面が止まってしまうのはマズイと思うのですが…
(上記はユーザ1とユーザ2のキャラクタが密着しているものとします)

根本的に考え方が間違ってるはずなんですが、正解がなんなのかわからないのです。

補足日時:2011/02/16 14:06
    • good
    • 0
この回答へのお礼

No2さんの参考URLを見て、やっとnak777r様の言っていることが
やっと理解できました。
理解力が足りなくって申し訳ないです。

> 1/60秒毎常にデータを送っている訳では無いと思いますよ

これについては回答者様によって意見が異なるようですが、おそらく
どちらでも実装可能そうですね。
信頼性を取るか、パフォーマンスを取るかみたいな話になるのかな、と
思います。

色々勉強になりました。
ありがとうございます。

お礼日時:2011/02/18 13:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!