Hatena::ブログ(Diary)

やねうらお−ノーゲーム・ノーライフ このページをアンテナに追加 RSSフィード

GT-Rの買取ならここですわ。どこよりも高く買取ってもらえるはず。お勧め!GT-R 買取
電王戦出場記念! 書籍化されたで! 監修したで!(`ω´) 絶版なってしもた Kindle版で復活!! 記事書いたで!
解析魔法少女美咲ちゃん マジカル・オープン!

YaneuLabs / やねうら王公式 / やねうらおにメール / twitter / プロフィール

 | 

2014-12-13 時代はまだゲームセンターあらしに追いつかないのか

[] 時代はまだゲームセンターあらしに追いつかないのか  時代はまだゲームセンターあらしに追いつかないのかを含むブックマーク  時代はまだゲームセンターあらしに追いつかないのかのブックマークコメント


私が小学生のころに『ゲームセンターあらし』という漫画が流行った。(1979〜1983年)「炎のコマ」と言う「スティックを高速で操作することでプレイヤー操作するキャラクターが敵から攻撃を潜り抜ける」というインチキまがいの技が出てくる。


私は小学生にして、その漫画に出てくる平安京エイリアンぐらいのゲームならオールアセンブラで余裕で作れる程度には天才児(?)だったので、「いくらスティックを高速に動かそうと、1回の描画ごとに1回の入力受付しかしないのだから、単に入力が取りこぼされるだけだろ。所詮、漫画だな。」と小馬鹿にしたものだった。


ところが、その考え方は間違いなんじゃないかと最近思うわけだ。


キーボード入力のようなユーザー入力は取りこぼしてはならないのであるユーザーは1秒間にたかだか10文字程度しか入力できない。キー入力の遅い人は数文字が限界かも知れない。それなのにCPU負荷が高いときやDisk I/Oの負荷が高いときキー入力を時々取りこぼすわけである現在CPUは数GHzというクロックに達しており、1秒間に1,000億回程度の浮動小数点演算が出来るくせに、たかだか1秒間に10回程度の入力を取りこぼすとか、ありえない。そのありえないことが現代においていまだに起こりうるのである


単にユーザー入力に関する割り込み処理の実行プライオリティを上げれば良いという話ではない。なぜなら、例えば、タブレット端末ではユーザー入力を行なうためにはソフトウェアキーボードの表示処理が必要で、Disk(SSD)への読み書きが忙しいからと言って、キーを取りこぼしたり、英語日本語キーボード切り替えに時間がかかったり、日本語変換に時間を要してはならない。ならない…が、実際はそうなるのである


ゲームセンターあらしから30年以上経ってるのにユーザー入力すら満足にさばけない欠陥OSが蔓延っているわけである。かと言ってユーザー入力に関するタスクの実行プライオリティを上げれば良いかというと、そういう単純な問題ではなく、本気で解決しようと思うといわゆるリアルタイムOSのように、高優先度のタスクが確実に実行されることを保証するための仕組みが必要になる。


ゲーム場合でも画面描画の更新回数だけしかワールド更新を行わず、キー入力も受け付けないゲーム多数派であるが、格闘ゲームなんかだと、画面描画は60fpsより遅れようともワールド更新(と入力)は1/60秒ごとなのを保証する作りになっているゲームもある。(10年ぐらい前に私がSNKKOF作ってたプログラマーの人たちと仕事をしたときも、そういう話が出た。)


もっと繊細なコマンド入力音ゲーのような超絶タイミングを必要とするゲームならばキー入力だけ画面描画より細かいインターバル入力を受け付けるのはおかしくはない。(まあ、入力デバイスUSBでぶら下がってたりするとどこまでの精度が保てるかという問題はあるが…。)


そう考えると、『ゲームセンターあらし』のように開発者の想定を超えた激しい入力がされたとき開発者想定外挙動をする(バグる?)ようなゲームがあっても、まあ、おかしくはないのかな…。


ゲームセンターあらしから30年以上を経て、あの漫画は自分のなかでは「そんなんありえへんわ!から、「ありえるかも…」に変わりつつある、という話でした。

amuseumamuseum 2014/12/13 10:34 入力遅延の観点から

>画面描画より細かいインターバルで入力を受け付ける

を行っている例としてこんなのを紹介します
http://www.ouma.jp/ootake/delay-j.html

Direct某の問題もあるようですが、内部処理をVsync以上に細分化する意味もちょっとはあるということで。

yaneuraoyaneurao 2014/12/13 10:52 ↑その例は、Vsyncと同期させる画面描画が前提にあって、かつ、次のワールド更新のなるべく直前の入力状態が取りたいがために「約1/240秒毎に休みを入れる」ことで入力のpolling周期を細かくしているようなのですが、ここが1/240秒である意味がよくわからないです。これ以上細かくしてもCPU負荷が高くなるだけで意味がないという判断なんでしょうか…。別にこの構造なら入力用にスレッド一つ起動して、そいつに処理させてもいいような気がします。

timelimitstimelimits 2014/12/13 14:14 昨今のリッチなゲーム機向けシステムは

> 別にこの構造なら入力用にスレッド一つ起動して、そいつに処理させてもいいような気がします。

この構造になってますね。これをシステムレベルでやってます。
入力のリスナーは複数いるため、それぞれのリスナーの都合でデバイスに問い合わせると高コストです。
ドライバーがデバイスのポーリングを描画フレームよりも数倍高速に行い、
リスナーはドライバの溜め込んだデータを参照する感じで。

yaneuraoyaneurao 2014/12/13 22:35 ↑なるほろ。音ゲーの場合などは入力遅延の問題よりは、押されたタイミングと曲の再生ポジションとの差がどれだけかという問題が大きいので、曲の再生遅延は事前に計算できるものとすると、押されたタイミング(時刻)は低レベルのドライバが1/10ミリ秒ぐらいの精度で記録しておいてくれると嬉しいのですが、そういう作りになっている入力デバイス(+ ドライバ)ってないもんですね…。1/60秒単位で正確に押しても満点とれないような糞判定の音ゲー多すぎ…。

Ta(ryTa(ry 2014/12/15 09:15 最近のタッチパネル端末の上で行うゲームはゲームになってない気がする。

こばこば 2014/12/15 19:12 ソフト的には1μS単位でもいいでしょうけど、物理的なボタン(ジョイスティックのスイッチを含む)にはチャタリングが付きものですから、そっちを改善しない限り10msくらいが限界なんじゃないでしょうか。

yaneuraoyaneurao 2014/12/15 23:52 ↑30年ぐらい前に、ジョイパッド(ファミコンのコントローラー型のPCに接続するデバイス)だと計測したときに結構なチャタリングがあって5〜10msぐらいの幅で積分してやらないと入力状態を2度検出してしまっていました。しかし、近年のジョイスティックのスイッチはそのへんが改善されているのか、1ms間隔でポーリングしてもチャタリングは検出されないです。ジョイスティック側に積分回路が入っていて、チャタリングは完全になくなった状態の値しか返してこないのかも知れませんが。だとしたら、この積分回路分の遅延は潜在的に発生していることにはなりますが、ポーリング間隔は限りなく小さくしておくほうが、入力されてからの遅延時間は小さくなることにはなります。

timelimitstimelimits 2014/12/16 01:25 チャタリングについてはハードウェアレベルである程度回避している様子です。

チャタリングは信号の"跳ね返り"のような現象です。強く下に叩きつければそれだけ激しく
跳ね返りますので、一般的には電流値を調整したり抵抗やコンデンサでゆっくり落とすようにしたりとか。
ヒステリシス特性のある端子につなぐとかも効果的でしょうね。

ななしななし 2014/12/17 21:40 音ゲーでms判定なのに入力が毎秒60回だったりすると悲惨ですね。ノーツ毎に見た目と判定の前後幅が異なるカオス状態です。
ただ60fpsでフレーム判定されても、見た目に対するリズム的な違和感が凄まじいのでms判定かつ入力判定は1000fps欲しいところです。
フレーム判定するなら、流れてくるノーツもフレーム単位でクオンタイズして配置してほしい……

yaneuraoyaneurao 2014/12/18 07:42 ↑*1 「1000fpsは欲しいところ」とは、どこの全国スコアラーさんですか…。
↑*2 > チャタリングについてはハードウェアレベルである程度回避している様子です。
普通、そうですよね…。私が30年前にジョイパッドを分解したとき、特別な回路は何もなくI/Oに直結みたいな感じでした…。

KKKK 2014/12/18 23:27 リアルタイムOSが必要ってTRONはやっぱ慧眼だったか。
マイクロソフトのレースゲームのForza Motorsportシリーズは映像は60FPSだが内部処理が360FPSなってて快適らしい。

bbgbbg 2014/12/19 12:31 新ブログ拝見しました よかったです
こちらでも告知記事を出された方がいいかもしれませんよ
例えば自分の場合、Twitter を普段チェックしてないので、気づくのに時間がかかりました

yaneuraoyaneurao 2014/12/19 14:39 ↑*2 レーティングゲームですと内部処理はある程度細かくないと走行ラインが体感と一致しなかったりするんですかね…。(私にはよくわかりませんが…)
↑*1 ありがとうございます。ひまうら王の実験を開始するときにこちらのブログでも告知します。

Ta(ryTa(ry 2014/12/20 09:55 Forzaはアイマスの痛車を作るゲームだと思ってた。

アマグラマーアマグラマー 2014/12/24 21:36 レースゲームの内部FPSが高いのは、挙動の物理計算のためでは。
少なくとも自分が関わってたps2のレースゲームではそのために描画以上に回してました。

yaneuraoyaneurao 2014/12/24 21:43 ↑ああ、なるほど。接触判定とか、ある程度ワールド更新が細かくないと正確にならないので、そういう意味はあるんですかね…。

IQ135IQ135 2014/12/25 06:34 やねうらおさん、
対戦脳トレアプリで世界1目指してください!

り 2014/12/28 08:49 2次元で三体問題シミュレーションプログラムを組んで、ワールド更新の時間間隔でどうなるか見てみるのがいいと思います。

○○法みたいな複雑な方法は一切使わずに、めっちゃシンプルに重力があって、それで星が引っ張られてみたいなめっちゃシンプルな方法で

yaneuraoyaneurao 2014/12/28 12:27 ↑*2 反射的に答えを出すのは若いほうが有利なので世界一になれないとです(´ω`)
↑*1 それ昔、ビリヤードゲームを作ったときに似たことをやったのですが、ワールドの更新の刻みが大きいと衝突の仕方が嘘くさくなりますね。(あまりにfpsが低いとボールがボールを突き抜けていったりしますが…)

YakitoriYakitori 2014/12/31 05:06 今年ももう終わりますがいいものが見れました。
来年もやねさんにとって実のある年でありますように。
皆様、よいお年を!

さびねこにゃさびねこにゃ 2015/01/03 05:27 こういう想定外の現象はネットワークゲームでもあります。
ファンタジーアースゼロというゲームは帯域を抑えるために2歩ごとに位置を送るという動作をしていました。初めのうちはこれでうまくいっていたのですが、1歩動いて1歩別の方向に動くことで正しい位置を伝えられないというバグを見つけてしまいました。プレイヤーは少しでも優位に立つためにこのバグを積極的に利用したので、運営は禁止令を出しましたが、相変わらずこのバグを利用する人はあとを絶ちませんでした。
ちなみに同じ会社が作ったメビウスオンラインではこのバグは解決されてますが、被弾側のほうで攻撃が当たってないのに当たったと判断されるバグが見つかってしまいました。

さびねこにゃさびねこにゃ 2015/01/03 05:29 追記
ファンタジーアースゼロは被弾側判定。メビウスオンラインは攻撃側判定となっています。

YakitoriYakitori 2015/01/05 18:32 やねさんに質問です。
このブログは近いうちに閉鎖されるのでしょうか。
それと、HDDでも搭載しないとIOをビジーにするのは難しいと思います。SSDで快適になりましたよね。

ニコ厨ニコ厨 2015/03/29 21:29 バグと言ってしまえばそれまでですけど、TASではフレーム刻みでタイミング測って操作することで攻撃や壁をすり抜けたりメモリ破壊や任意コード実行したりする奴がちょいちょいありますよ。
マリオ3とかスーパーマリオワールドとかマリオ64辺りは遊びつくされてる感がすごい。
で、そういうのを実機再現しようとする人も実際いてキャッスルヴァニアのRTAとか酷い。

ファミコンゲームでファミコンゲームで 2015/04/17 01:36 開発版を某達人が高速連射したらフリーズした、という話は本当だったのでしょうか…。
昔からのすごい疑問ですわ。

探偵ナイトスクープに応募してみようかしらん…。

トラックバック - http://d.hatena.ne.jp/yaneurao/20141213
 | 

1900 | 01 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 06 | 08 | 10 | 11 | 12 |
2015 | 01 | 02 |


Microsoft MVP
Microsoft MVP Visual C# 2006.07-2011.06