「2013/10/20-01」の編集履歴(バックアップ)一覧に戻る
2013/10/20-01 - (2013/10/21 (月) 23:01:58) のソース
**G-SYNC 大変御無沙汰致しております。実に四日ぶりの更新。 Windows8の3フレーム遅延説についてあれこれ作業をしていたら休日が終わりました。 最高に楽しいですWindows8のあれこれ。 まさかこの歳になって自宅で半田ごてを握るとは。(笑) ---- 先日は[[AMDが自社イベントのGPU14で新技術のMantleを発表>>http://www45.atwiki.jp/goodgames/?page=2013%2F10%2F20-01]]した件について取り上げましたが、 今度はNVIDIAも自社イベントのNVIDIA Editor's Day 2013にて新技術の発表があったようです。 ちなみに昔は良くこの種の発表会に出かけました。 目当てはおみやげ。帰りにサプライズで発表された新商品そのものがもらえることが多々ありました。 最近はどうかわかりませんが... ---- ***G-SYNCとは いくつか発表された中でも話題となってるのが[[G-SYNC>>http://www.geforce.com/whats-new/articles/introducing-nvidia-g-sync-revolutionary-ultra-smooth-stutter-free-gaming]]なる技術。 これ一言で申し上げれば、 &b(){モニタの垂直リフレッシュレートをGPUの状態に合わせて変化させよう} と言う発想。 &b(){庶民的には60Hz固定}なリフレッシュレートをPC側が辛い時には50Hzや40Hzでリフレッシュしてくれる技術ですね。 120Hzや144Hzのモニタでは状況に応じ、110Hzや100Hzでリフレッシュしてくれるそうです。 ちなみに、タイムリーなのかそうでないのか、Windows8の3フレーム遅延説の検証作業と完全に被るネタだったりします。 ---- ***そもそもの問題 昔の2Dゲームのように、ハードウェア性能に十分な余裕があった時代は、 常にWaitをかけて(PC側の処理を意図的に遅らせて)モニタのリフレッシュレートに合わせて 映像を出力していました。 しかし、コンテンツの3D化とともにソフトウェアとハードウェアのパワーバランスが逆転し、 常にハードウェアの性能が不足する状態が続いています。 (あくまでも新しいコンテンツがリリースされた直後の話ですが) また、一部のPCでは十分な性能が確保出来ても、 PCは一台ごとに構成が異なることから低性能なPCでもそれなりに稼働することが求められ、 やはり性能が不足する環境で稼働させる必要が生じます。 そのため現状では各ハードウェアによって 可能な限り高速で描画するのが一般的となっています。 しかし、ここで問題が... ---- ***1.垂直リフレッシュレートを超えるフレームレートで描画するとティアリングが発生してしまう 具体例を挙げると60Hzのモニタを使用している環境で70fpsや80fpsなど、 垂直リフレッシュレートを上回るフレームレートで画像を描画すると、 画面がちらついて見えることがあります。この現象をティアリングと呼びます。 視覚的に認知可能か否かと言ったところや、ソフトによっても異なるでしょうが、 フレームレートがあがるほどティアリングは酷くなります。 これはソフトウェア側の描画処理とモニタへの映像信号の送信処理が非同期であるため、 モニタへ映像を出力中に映像が格納されたバッファの内容が、 次のフレームの情報で上書きされてしまうことが原因です。 そのため画面の一部だけ次のフレームの映像が表示される現象が発生しますが、 この現象が継続する時間は僅か1/60秒(16.667ms)だけであるため、 2フレーム分の映像が同時に表示されたとは認知できず、 単なるちらつきに見えるようです。 &b(){大雑把に言えば上半分が1フレーム前の映像、下半分が次の映像になります。} もちろん、次のフレームではさらに1フレーム先の映像が混在して表示されることにより、 ちらつきが継続することも考えられます。 ※混在と言っても実際にはぐしゃぐしゃになるわけではなく、 上側が古いフレーム、下側が新しいフレームになると思います。 ---- ***2.垂直リフレッシュレートと同じフレームレートを維持すると描画遅延が発生する (以下、フルスクリーン表示に限定して記述いたします) 良く知られた&b(){V-Sync有効}な状態です。 少なくとも私が知る限りV-Syncが有効になっていればティアリング(ちらつき)は発生しません。 しかし、この方式にも問題があり、 &b(){シビアな応答性能が求められるアクションゲームでは激しく嫌われるようです。} V-Syncが有効になっている場合、描画タイミングは垂直リフレッシュレートに依存するため 60Hzモニタの場合、描画出来るチャンスが16.667msに1度しかありません。 何らかの理由により高い負荷が生じ、1フレームの描画に17.000msを要したとしましょう。 この場合、次のリフレッシュタイミングに間に合わないため、 その次のリフレッシュまでモニターに出力されません。 (描画処理の最終段でCPU/GPUともに無駄な待ち時間が発生します) そのため、結果的に1フレームの描画に33.333msを要したことになってしまいます。 ---- ここまではフレームレートの低下による描画遅延ですが、 もう一つ描画遅延が発生する理由があります。 この16.667msのリフレッシュ周期に間に合わない状況に陥らないよう、 &b(){1フレーム分先行で描画しておく方式が}あります。 通常、DirectXでは2枚の描画用バッファを用意し、 それぞれアプリケーションからの描画用1枚(バックバッファ)と モニタ転送用の1枚(フロントバッファ)に分けて使用しています。 これはバッファが2枚あることからダブルバッファリングと呼ばれています。 これに先行書き込み用のバッファを追加し、 描画用バッファを2枚用意することで合計3枚の構成とする方式も用意されており、 これはトリプルバッファリングと呼ばれています。 超手抜きイメージとしては下記のようなものです。 バッファ1...モニターへの出力用フロントバッファ バッファ2...次にモニターへ出力する予定のバックバッファ バッファ3...現在CPU/GPUが描画中の画像が出力されるバックバッファ フロントバッファと描画用バックバッファの中間に描画済みのバッファが1枚挟まることにより、 リフレッシュタイミングに描画対象が存在しない事態に陥らないよう準備しておく仕組みです。 しかし、まさに今起った事象、例えばプレイヤーが銃を撃つなどの事象が画面に表示されるのは、 常に2フレーム(33.333ms)先になってしまうためアクションゲームのプレイヤーからは不評のようです。 ※トリプルバッファリングは一部のゲームやビデオドライバの設定画面から選択可能ですが、 あまりDirectXの世界では利用されていないようです。 ゲームよりも3Dグラフィクスなどでの利用が多いOpenGLで主に使われています。 ---- トドメにもう一つ問題が。 これはアプリケーション(ゲーム)の実装次第で変わりますが、 多くのゲームに共通(らしい)方式として &b(){プレイヤーの入力情報は画面描画と同期する}点が挙げられます。 一例を挙げるとFrostbite2.0及び3.0の場合、 プレイヤーの挙動は1秒間に30回の頻度でゲームサーバに送信されます。 つまり33.333msに1度の割合です。 しかし、33.333ms周期で常に送信されるかと言うとその通りではなく、 &b(){前回送信から33.333ms以上が経過した次の描画タイミングに送信する}仕様になっているようです。 (この点は完全な裏付け調査をしていませんが、 フレームレートが30fpsを下回ると送出パケット数とフレームレートが一致するため、 ほぼ間違いないと言って良いでしょう) ---- ***ごちゃごちゃと書きましたが &b(){&color(red){1.フルスピードで描画すると画面がちらつき(ティアリングが発生する)、}} &b(){&color(red){2.ティアリングが発生しないよう、リフレッシュレート(通常は60Hz)に合わせて描画すると}} &b(){&color(red){ 間に合わなかった場合は30Hz相当までフレームレートが低下する。}} &b(){&color(red){ 間に合わなくなる場合を想定して1フレーム先行で書くと遅延が発生する。}} &b(){このように、背反する2つの問題を一気に片付けようというのがNVIDIAの狙いのようです。} &b(){技術解説としては日本語だと[[こちら(GAME Watch)>>http://game.watch.impress.co.jp/docs/news/20131019_620128.html]]に優しく書かれています。} ---- ***でもお金がかかります 無料かと思いきやそうは行かないのがハードウェアの世界。 この問題はソフトウェアだけでは解決出来ないため専用のハードウェアが投入されます。 120Hzや144Hzなど高性能モニタに追加するカードになるようですが、 カードを単品で購入すると$175とのこと。 またカードが最初から付いているモニタを購入すると[[単純計算だと$129ぐらい>>http://www.legitreviews.com/top-game-developers-answer-4k-nvidia-g-sync-monitor_126772]]になるとのこと。 あくまでもモニター1機種を例に挙げた価格ですので、幅があると思いますが。 このお値段いかがでしょうか? 私のような庶民の60Hzモニターでは使えないようですが、 120Hzや144Hzのモニターを使用している方には朗報かもしれません。 ---- ***Adaptive VSync これ適当にGoogleあたりで調べて下さい。 1~2年ぐらい前に画期的な方式としてNVIDIAよりリリースされた技術なのですが、 残念ながらほとんど効果が無かったようです。 そのための代替案としてG-SYNCが出てきたと。 ソフトウェアとGPUだけで実現出来るアイディアだったのですが。 ※どのモデルから使えるのかは未確認ですが比較的最近のGeForceをお使いの方は利用出来ます。 ---- ***G-SYNCの[[FAQ>>http://www.geforce.co.uk/hardware/technology/g-sync/faq]]より引用 &b(){■対応GPUは?} GTX TITAN GTX 780 GTX 770 GTX 760 GTX 690 GTX 680 GTX 670 GTX 660 Ti GTX 660 GTX 650 Ti Boost &b(){■対応OSは?} Windows 8.1 Windows 8 Windows 7 &b(){■対応ドライバは?} R331.58 or higher (いつの間にかリリースされてた) &b(){■全てのゲームで使える?} 全てのゲームでは使えない。 使えないゲームではドライバの設定でG-SYNCをOFFにすれば大丈夫。 &b(){■どこのメーカのモニタが対応する予定?} ASUS, BenQ, Phillips and ViewSonic. ---- ***個人的に大きな疑問 どこかに明記されているかもしれませんが... &b(){原理的にWindowsモードでは使えないでしょう。} ---- ***[[偽G-SYNC>>http://www.nvidia.co.jp/page/quadrofx_gsync.html]] なんとNVIDIAから公式に偽物のG-SYNCが発売されていました。 なんだこれ。(苦笑) ---- ***さて結論ですが 技術的に正しいと思いますが、要らないですよね? そもそもティアリング(ちらつき)ってそんなに気になりますか? 私が鈍感なだけかもしれませんが。 60Hzな庶民としては60Hz+αぐらいのフレームレートで描画可能な画質設定を行い、 V-Sync無効でプレイすればそれで充分だと思うのですが。 現在、Windows8の3フレーム遅延問題について様々な角度で「遊んで」いますが、 意図的にティアリングが発生する状況を作り出し、 それを観察しようとしてようやくティアリングに気付く程度にしか感じません。 くどいようですが私が鈍いのかもしれませんが。 NVIDIAがターゲットにしているのは120Hz/144Hzなどの 高性能ゲーミングモニタに分類される機種のようですので、 庶民には理解し得ぬ世界があるのかもしれませんが、 高フレームレートになるほど1フレームの遅延による損失は小さくなります。 (60Hzなら16.667msだが120Hzなら半分の8.333msで済む) それに120Hzモニタを使うような方々は 「120Hzを割ったときにどうするか?」ではなく 「どうしたら120Hz超を維持出来るか」を考えますよね? (120Hz超になると今度はティアリングの問題が発生しますが) とは言えモニタの有料オプションではなく、 ゲーミングモニタに差額無しで標準装備されるようになれば普及するかもしれません。 ---- 普及する頃にはライバルのR-SYNCが登場していると思いますが。 (&Counter())