« 壁に沿って転がる玉 | トップページ | ポインタの理解を妨げるもの 第4回 »

2012年4月22日 (日)

フレーム表示遅延が操作遅延の要因であるという謂れなき罪

Windows Vistaから搭載されたAeroにはデバイス画面の更新をキューイングする機能が採用されている。それがゲームの操作性を悪くする要因だとする説がまことしやかに囁かれ巷に蔓延しているようだ。

先日メインストリームサポートが終了し延長サポートに入ったWindows Vistaは発売から既に5年が経っている。とうの昔から解消手段が用意されているというのにいまだにしばしばテアリングを我慢することを強いられるのはこのような噂が原因なのだろうか。腹立たしいことこの上ない。

キューイングされるのはデバイス画面を更新するAPIを立て続けに呼び出した場合だ。

APIレベルでVSYNCを待つようにしていても最大数まではVSYNCを待たず一気にキューイングされる。そしてキューに空きが無くなると、VSYNCを待つ・待たないに応じたタイミングでひとつずつ順送りされることになる。

この状況はキューの最大数フレーム分内部処理が先行することによるものだが、視点を変えるとデバイス画面の更新が遅延しているという見方もできる。フレームレートの制御をVSYNCのみに依存したゲームソフトや、間髪入れず更新して速度を計るベンチマークソフトはこのような状況になる。

この問題は簡単に解消できる。デバイス画面を更新するAPIを適切なタイミングで呼び出せば良い。

処理落ちしても一定のFPS制御』のサンプルプログラムを変更して58FPSに対して1フレームあたり16ミリ秒の負荷をかける実験をしてみた。モニタのリフレッシュレートは60Hzだ。

Aeroの元ではテアリングを発生させずに58FPSを維持するが、Aeroを無効にするとFPSが下がりUFOの回転が一定周期ごとに遅くなるのを繰り返す。

モニタのリフレッシュレートと要求するフレームレートのズレが蓄積しVSYNC待ちの占める時間が徐々に大きくなってしまうため速度にムラができる。旧来は、テアリングを容認してVSYNCを待たないようにするか、蓄積したズレを解消するために定期的にコマ落としするか、どちらかの方法で対策を行わざるを得なかった。

だがしかしタイマーでデバイス画面を更新するタイミングを計りキューイングを利用することで、プレイヤーに不快な思いをさせることなく半端なフレームレートでも正確に維持することができる。表示の遅延は最大でもモニタのリフレッシュレートにおける1フレーム未満に抑えることができる。

Aeroとキューイングを無効にしてさらに58FPSをキープさせるためVSYNC同期しないように変更した(代わりにテアリングが発生する)プログラムと操作感を比べてもみた。操作遅延が発生しないとされるこちらと感覚に違いはない。

筆者にとっては10年来待ち焦がれた機能だが、否定することそれ自体は個人の勝手だからかまわない。しかし強制することが問題だ。ユーザーに選択の余地を与えるべきだ。姑息な手段が生む不具合の連鎖は止めなければならない。

|

« 壁に沿って転がる玉 | トップページ | ポインタの理解を妨げるもの 第4回 »

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 壁に沿って転がる玉 | トップページ | ポインタの理解を妨げるもの 第4回 »