2014/10/21

描画遅延について思うこととか

図なし文字だけの、半ば愚痴じみたメモ。新しい情報とかは特に無いのでひっそりと更新。


・遅延の定義
そもそも描画遅延って表現がどうなんでしょう。
諸々の定義や測定手法とかを自分なりに「ゲーミング環境における入力-描画遅延の定量的評価」なんて名前のPDFファイルにしていたのですが、ファイルの海に沈んでしまいました。

とりあえず、最近私が言っている描画遅延は、
【手での入力→マウス→PC→ディスプレイ→カメラ】へ動作が反映されるまでの時間としています。
しかし人体の表面は弾性体ですし、加速特性が緩やかという特徴があるので、とりあえず
【マイコン→PC→ディスプレイ→カメラ】という流れにして、当該間の所要時間を測ったというのが前回の記事でした。

現実世界では、動作させたい物(普通は人体ですね :D)と実際に作動する物が同じですので、例えば手の動きが手に反映される時間は0になります。
もちろん作動させるシステム(銃・機械等)の動作にかかる時間があるので、現実世界においても無遅延では無いのですが、こちらは完全にメカニカルエンジニアリングの世界ですし、機械においてはバックラッシ等が必要なので理論的に0には出来ません。



・昔もトライした話
実は過去に人の手と電飾付きゲーミングマウスでトライした事はあったのですが、マウスの動き始めは一桁カウントになる場合が多く、ミリ秒単位の精度を出すにはそれなりの根気と工作が必要だということで休止させていました。
その時はUSB HID制御無しで精度を出すそうと思っていて、マウス自体に物体を衝突させて一気に加速させる手法あたりを考えていました。
後はマイコン制御のモータを使って制御するとか、こっちは結構遠回り感があります。

今後のことを考えると、センサ+マイコンの速度・加速度応答の特性を測るにはどちらにしろそれなりに速いモータを制御しないといけないので、機械加工とモータドライバ作りは必須なのですが。「やりたいこと」と「技術力」と「時間管理能力」がチグハグな感じです。



・システムのコンフィギュレーションについて
rafaさんから、デバイスやゲームエンジン等のシステム全体のコンフィギュレーションを変えてテストすればより低遅延な設定を模索出来るのではないかというコメントを頂いて、とりあえず自分の環境ではトライしてみようかなと思っています。
とりあえずCS:GOのグラフィックの設定をいじくり回す所からですね。あとはオンボードの不使用デバイスを無効化したり、ぶら下がってるHID達を取り除いてみたりモニタの固有機能のON/OFFとかは調べたいです。



・より網羅的に遅延を考える
遅延時間を変えうる要素として、入力側から順に

マウス
OS
Raw Input
ゲームタイトル
各タイトル内でのコンフィグ
GPUベンダー
GPUのアーキテクチャ・機種
各デバイスのドライバのバージョン
各デバイスのファームウェア
ディスプレイそのものの
各ディスプレイの固有機能

などなどがパッと思いつくだけでも挙げられます。
勿論、財力的にも人的リソース的にも私だけで全部テスト出来ませんし、そもそもする気は初めからありません。
そういう意味ではゲーミング環境における遅延測定のフレームワークが必要なのかなといった感想を抱きます。更に先を見ると、最も遅延が少ない状態へ自動でチューニングしたりとか出来ると極低遅延環境実現への夢が広がります。
また、複雑なシステムの測定では、厳密にレギュレーションをして評価する必要があるので「ベンチマークレギュレーション」的なものも合わせて必要なのかもしれません。
まあ、同一システム内での相対値だけ見れば違うシステムでも大体は適用出来ると思うのですが。とりあえず自分で測った分は公開したいと思います(私がトライすれば、ですが)。

遅延自体は、ある程度ゲームをやっている方なら体感して、注意していると思うのですが、日本だとあまりフォーカスされない話題ですね。やはり、昔は機材も高価でしたしミリ秒単位の定量的に測れない物だったということも関係しているかもしれません。
VRの辺りからはチラホラ話が出ているような気もしますし、もう少し盛り上がると良いのですね。



・Ask.fmはじめました
URLはこちら。
http://ask.fm/systema_

デバイスに関しては大した台数持っていませんし、やっている事が低レイヤの部分ばかりなので「このマウスどうですか?」的な質問には全然答えられません。またゲーミングデバイスに関しては偏見的かつ、かなりラジカルな思想なのでその点に関しても微妙。
左利きなのに右手でマウスを使っていて、射撃キーをキーボードにバインドしていてG300rが最強だと主張するゲーマーに聞くことでもないと思います。

「G402に載ってる加速度センサの詳細を教えて下さい」とか「マウスに付いているLEDが増えると遅延が増えるの?」的な質問なら嬉々としてお答えできるのですが。

また、匿名性を上げることで、ブログの内容についての質問とか誤りの指摘を期待しています。
自分は記述を端折る癖があるので、わかりづらい所とか可視化出来ると良いなと思っています。こんな感じで結構ネガティブなモチベーションですが、分かりづらかったり、嘘を書いてそれを公開していても仕方ないですからね。

2014/10/19

ゲーム毎の描画遅延を測定してみる

---------------------------------------------------------------------------------
2015/05/20 : Baselineを追加 (当該記事参照)
2014/10/20 : QUAKE LIVEを追加
2014/10/19 : 初出
---------------------------------------------------------------------------------

                「このゲーム、視点移動がモッサリしてね?」

こんな感想を抱く事ありませんか?
良く「ヌルヌル」しているというポジティブな表現が用いられますが、私的にはせめて視点移動は「サクサク」している方が良いのです。
特にシューターだと、視点移動の描画遅延が少ない方が競技性的にも、ユーザビリティのためにも良いことだと思います。

本記事の目的は、体感では評価しにくいミリ秒単位の描画遅延を定量的に測定して公開することで、ゲーミングにおける描画遅延低減への取り組みを促進する事を意図しています。

このトピックは2年程前からやりたかったのですが、ひょんな事からUSB Mouseのcountを自由に制御出来る環境が整ったので実施。

測定方法

・撮影機材 : Nikon 1 V1 (レンズ : 1 NIKKOR 10mm f/2.8)
・MCU : CY8CKIT-050 PSoC® 5LP Development Kit

PSoC 5LP上にフルスピードUSBのHIDデバイスを作成し、3-button Mouseと設定。
今回はX軸のみに左右30 Countsを転送します。
また、MCUから0位外のカウントを送る際にLEDを点灯するようにプログラムしています。LEDの点灯からデータ転送間の遅延はμsオーダになっているはずなので無視できる範囲だと思います。


流れはこんな感じ。
・右に30countを128回(128ms)
・128回(128ms)停止
・左に30countを128回(128ms)
・128回(128ms)停止
これを繰り返して、LEDと画面の様子を撮影します。

Nikon 1 V1 のハイスピード撮影を使用して、ゲーム中の視点移動の様子を1200fpsでの撮影を行います。
そして、撮影データを1フレーム毎に表示し、LED点灯から描画の開始までのフレーム数を数え10回の平均を取り遅延時間を算出します。


最後に動画を載せるので雰囲気を掴んでいただければと思います。

結果

 結果は以下の通り。



Warsowがかなり優秀ですね。1.5系はかなり綺麗な描画ですので、「(体感は出来ないにしても)結構遅延がありそうだな」と予想していたのですが。

 BF4に関しては予想通り。自分が初めてBFBC2をプレイした時「何だこの描画遅延!?」と動揺したのですが、Battlefieldシリーズは描画遅延が多めな印象でした。特に3以降は輪にかけて遅延しているような。BF3とBC2も計測すべきですね。

もっと色々なタイトルで測定したいのですが、とりあえずプレイしている(していた)タイトルだけで計測しました。CoD:Gはかなり描画遅延があるようなので気になりますがゲームを持っていないのでフリーウィークエンド待ちだったり。

追記(2014/10/20) : 似たような事をしている方が居らっしゃいました。
rafa様、情報ありがとうございます。
ESR - Input lag tests QL/CSGO/Q3A - Hardware Forum
http://www.esreality.com/post/2640619/input-lag-tests-ql-csgo/

こちらとデータが違うのはシステムのコンフィギュレーションが原因なのか測定方法が違うことに依るのかは不明です。こちらとしては、最低でも±2msくらいの精度は出せる計測システムだと自負していますが :D

色々なマルチプレイヤー対応タイトルを計測して一覧でグラフを出せればよいのですが。
ゲームを買うお金がありません。gg.

おまけ

撮影した動画は以下。

2014/10/14

FPSにおける武器の精度について考えてみる

CS:GOを題材に挙げて説明しますが、「精度」の概念が存在するFPS一般において適用できる話になります。ほとんどの人は体感的に分かっていそうな概念を図解してみようというトライです。

●精度とは

この記事で言う「精度」とは、いわゆる初弾精度のことです。この初弾精度とは、
銃を発射した時に一発目の銃弾が着弾する可能性のある範囲の大きさ
です。
着弾する可能性がある範囲が小さい場合を精度が良い(高い)、
着弾する可能性がある範囲が大きい場合を精度が悪い(低い)と言います。
精度の良し悪し

もちろん、連射するにせよ一発しか撃たないしても(初弾)精度は変わりません。
弾丸が着弾する可能性のある範囲は、基本的に円形になります。


CS:GOで言うと、サブマシンガン等が精度が悪く、アサルトライフル系が精度が良いイメージですね。
ちなみにCS:GOでの精度は図のようなBuy Menuの赤線の部分で確認できます。
Buy Menu
AccuracyRangeを見てみると、「思ったより高い」とか「低い」とか感じた武器があると思います。武器の強弱は他のパラメータも大きく関係しているので武器の使用感から感じるものとは少し違った感じになりますね。

●確実に着弾する距離は?

CS:GOの中にあるAccuracy Rangeを元に考えてみます。
(他のゲームでも似たようなパタメタがあると思いますのでご家庭のパソコンで調査して下さい。)
ちなみにこの値ですが、CS:GOのRelease Notes for 7/1/2014によると
- Accurate Range ( The distance up to which 100% of shots will land within a 30cm circle. See cl_weapon_debug_print_accuracy )
ということですので、
30cmの円を狙って撃った場合に確実に着弾する距離の事を示しています。
要するに「完璧なAIMであれば確実にヘッドショットが出来る距離」として良いでしょう。(ちなみにCS:GOの頭のHitboxは四角いので実際はもう少し複雑。)

と言っても、頭に当てれば即死か90hit程度して「ほぼキル」状態に出来るアサルトライフルとは違い、威力の低い武器は胴体に余計に数発入れる必要があったりするので精度以外にも考慮が必要です。


逆に、「これ以上離れるといくらAIMが完璧でも、弾が外れる可能性がある」ということも意味します。AK-47を例に取ると、40mで撃ち合った時、1ピクセル分の誤差もなく完璧にAIM出来たとしても、胴に当たったり頭の横に着弾したりしてヘッドショット出来ない可能性があります。
これが結構重要で、例えばdust2でPit(坂下)とA-Siteの間くらいの遠距離撃ち合っても、弾が当たるかどうかは乱数生成器が選んでいるので運要素が強くなります。AIMが完璧だとしても本当に弾が当たるかどうかは、撃ってみるまで分かりません。

(AKの場合)~31m : 撃てば確実にHSになる                  |  31m~ : どこに当たるか撃ってみるまで分からない

ロングレンジでの撃ち合いでスナイパーライフルが強いのは、「敵がAIMerでもこちらの被弾リスクを確率的に下げて交戦できる為」というのも一つの要因です。

●精度が高いとAIMの許容範囲が増える

前項で精度が高いと確実に着弾出来る距離が長くなる事を説明しましたが、もう少し実戦よりで考えてみましょう。そもそも人体に1フレーム時間以上の応答時間(反射神経)が存在する以上、脳で応答時間分の位置推定を行ってAIMする位置を決める訳で、位置推定の精度の差こそあれ「完璧にAIMする」ということは出来ません。

そこで考えたいのが、「どれ位までAIMの誤差を許容できるか」という事です。

ここではGalilとAK-47を例に考えてみましょう。
GalilのAccuracyRangeは23m、AK-47のAccuracyRangeは31mです。
また、簡単のため敵が23m先に居ると考えましょう。
Hitboxをこんな感じだと想定します。

GalilのAccuracyRangeを考えると
着弾範囲はこんな感じになります。
この場合完璧にAIMされているので
撃てば確実にHSになります。
 では少しずれるとどうでしょうか。

図のように、Hitboxからはみ出た部分が発生します。
はみ出た部分に着弾する可能性もあるので
「確実に」着弾するとはいえません。

AccuracyRangeの大きいAK-47の場合についても考えてみます。
完璧にAIMすればこんな感じ。


先程と同じくらいずらすと・・・
どこに着弾してもHSになります。

精度が高いとAIMが大きく
ずれてもHSに出来ます。


許容できるAIMの誤差をおおよその図にしてみました。
小学校でやる長方形の中を転がる円の中心の軌跡を求めるアレですね :D
許容誤差の範囲
 このように精度が高いと、「確実にHSするのに必要なAIMへの誤差」の許容範囲が大きくなる事がわかります。

AccuracyRangeが長く(50m)AIMの許容範囲が大きい事が、個人的にSG556(SG553)を推している要因の一つだったりします。

●着弾分布

精度に関してもう一つ考慮に入れるべきなのが着弾分布です。
着弾分布とは端的にいうと、「着弾範囲内の中の任意の点に着弾する確からしさ」ですね。
CS:GOは手元にデータがないのでBF3のデータを拝借。
BF3 Accuracy plots, shooting simulator | Symthic
http://symthic.com/bf3-accuracy-plots?attc=Foregrip

図の初弾、つまり黄緑の部分に注目して欲しいのですが、明らかに中央付近の着弾回数の方が多く見えます。これはつまり、乱数生成の際にガウス分布的に着弾を中央に寄るように調整しているようです。
CS:GOの厳密なデータは手元に無いのですが、私の体感では明らかに中央に寄っています。ジャンプ中に射撃すると、ど真ん中に飛んで行く事がままありますし。そもそもAccuracyRangeが31mしかないAKがこんなに当たるはずがありません。

着弾分布を考えると、AccuracyRange以上で交戦しないといけない場合でも頑張ってAIMすれば当たる可能性はそれなりに上がるということですね。がんばりましょう。

●精度が低い場合について考える

逆に精度が低いと何が悪くて、何が期待できるのかについて考えます。
・悪い事 : 弾が外れることが多い
図のようにAccuracyRangeに対してかなり長い距離で交戦した場合に、多くの場合ヒットボックス以外の場所に着弾しますね。

もはやワンチャンしかない感じ


・良い事 : (稀に)AIMが適当でも当たる可能性がある

まぐれHSの図
ジャンプ中AIMも合っていないのに適当に撃ったら頭に当たった、なんて状況が極稀に起きますね。それと似たような感じで、「AIMは合っていないのだけれど武器の精度が低かったので運良く弾がレティクルから外れて飛んで敵に当たった」という状況です。
精度の低い武器で遠距離でもHSがガンガン当たる時は「強い」ではなく「運が良い」という状態表現のほうが正しいです。

まとめ

まとめます。
・一般的に精度が高ければ高いほど良い
なぜなら
・有利な交戦距離が伸びる
・AIMの誤差を許容出来る

・もちろん精度以外の武器性能も大事
・自分の武器と相手の武器の精度差を意識する
・着弾分布的を考えるとAccuracyRange外でもAIMを頑張ると当たるかもしれない

後、精度が高い銃を使うメリットとして全てが自己責任になるってのもありますね。
精度の悪い武器でミスショットしても、原因を武器の精度せいにしてしまい上達しませんし。
AIMの許容誤差あたりは、ちょっと新規性あるかもとか思ったりして、超超基本的な事ですが記事にしてみるテスト。

2014/10/05

Dell mini9 (Inspiron 910) に Windows 10 Technical Preview をインストールしてみる

死蔵していたリグを活かしていこう、というわけで話題のOSをインストールしてみました。
「活かす」というよりは検体として供出した感じもありますが :D

Dell mini9は、00年代にパーソナルコンピュータの在り方を変えたNetbookというカテゴリ中でも第2世代と呼ばれるあたりの時期にリリースされた機種ですね。
1コア1.6GHzのAtomCPUにメモリが1GB、1024x600、SSDは16GBと言った感じ。
(今回使用するのは購入後に少しだけ手を入れていて、SSDをRunCoreの32GBのものに、メモリを2GBに換装しています。)

この頃は(特にアジアの)各メーカが似たようなスペック・価格で一斉にリリースしましたが、その中でもDell mini9はトップクラスに(上からの投影面積が)小型な機種でした。要するに物理的な秘匿性が高いのです。
当時の私は計算機を所有することが許されていない状況に置かれていたので、どこにでも隠せるような小ささは非常に重要でした。
未だに超小型クラムシェル型計算機に拘泥しているのはここらへんが原因だったりします。


それはさておき、インストール手順と気になった点をいくつか。

配布されているISOイメージから「Windows7 USB DVD Download Tool」でUSBメモリに焼きこんでインストール用のフラッシュを作成・インストールしました。
詳しくは下記参照。

・How to install Windows 10 on a PC using a USB stick - PC World Australia
http://www.pcworld.idg.com.au/article/556362/how-get-windows-10/

ここてちょっと詰まったのが、C123というUSB3.0対応のフラッシュメモリでイメージを焼いた所ブートできない事案が発生しました。新しいフラッシュメモリなので、数年前のBIOSからは見えないようです。なので4年くらい前のELECOMのMF-AU2A04GGTというフラッシュメモリに変更。
※Gの付く某有名ニュースサイトさんは、USBフラッシュメモリの容量は4.5GB以上必要と書いていらっしゃいますが、32Bit版ならファイルサイズ自体は3GB程度で、手元にある4GBのUSBフラッシュメモリでもインストール可能でした。

インストールに関してはインストールウィザードに従うだけなので割愛。英語版なのでウィザードも英語、インストール後のUIも英語です。

無事インストールしましたが、解像度が800x600以上に上げられません。
グラフィックチップ(Intel 945)のドライバが必要なので用意します。

・Windows 7* 用インテル® グラフィックス・メディア・アクセラレーター・ドライバー
 https://downloadcenter.intel.com/Detail_Desc.aspx?lang=jpn&DwnldID=18223

これで解像度は1024x600で出力されるようになりました。私はアス比が狂っている状況が非常に苦手なのでこの作業は必須ですね。


問題は無線LANが動かないこと。ドライバが原因かとも思ったのですが・・・
原因は無線LANのスイッチのユーティリティがインストールされていない為でした。
というわけでWireless Select Switchをインストール。

・Dell Battery Meter/Wireless Select Switch, v.1.0.0.9, A00 ドライバの詳細 | Dell 日本 http://www.dell.com/support/home/jp/ja/jpbsd1/Drivers/DriversDetails?driverId=C5G1W

あと2つ不明なデバイスが見えますが、Win7を入れてみた的な記事がチラホラあるので参考にすればサクッと潰せそうです。

ここまでで、
ディスク容量は32GB中・・・使用 : 9.18GB、空き : 20.6GB空き、
メモリの使用量は・・・・2GB中0.6GB使用でした。

結構軽量なんですね。死蔵しているガラケーPCのF-07Cの活路が見えてきたような。
体感的にはXPよりは遅いかなとか。しかしXPが選択肢として挙げられない現状では、7ではなく10を選ぶかなという所。新しいOSなのでブートは速いです。

UIに関しても良いのではないでしょうか。個人的には8も分からなくはなかったのですが、解法も示さずに解答だけ提示してもユーザは付いてこないという教訓が得られましたね。