「2013/10/27-03」の編集履歴(バックアップ)一覧はこちら
「2013/10/27-03」(2013/10/28 (月) 00:20:09) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
**3フレーム遅延問題 5
せっせと作業完了。
----
***■暫定的な結論から
&b(){はやく出せとの圧力が凄いので取り敢えずBattlefield3を例に挙げますと...}
&b(){あらゆる画面設定に於いて、大きな入力遅延が生じています。}
&b(){但し、画面設定が同様であればWindows7とWindows8にて遅延の程度に差は全くありません。}
&b(){&color(red){従って「Windows8は3フレーム遅延する」はBattlefield3に限定すれば間違いと断定出来ます。}}
----
***■既成概念的前提
&b(){この問題に関する重要なポイントをまとめると下記の通りとなります。}
&b(){1.Windows Aeroが有効になっているとアプリケーションの描画が3フレーム遅延する}
&b(){2.Windows8ではWindows Aeroが無効に出来ない}
&b(){3.上記1.及び2.によりWindows8ではアプリケーションの描画が3フレーム遅延する}
鮮やかな三段論法です。
----
***■不足
&b(){絶望的に見える上記前提には二つの重要な要素が欠けています。}
&b(){A.3フレームの遅延はあくまでも最大であり常に3フレーム遅延するわけではない}
&b(){&color(red){B.DirectXアプリケーションはアプリケーション内で最大遅延フレーム数を指定出来る}}
&b(){もう説明の必要も無いと思いますが、Battlefield3内部にてB.の処理が実施されていると考えられます。}
&b(){そして、Windows7にてWindows Aeroが有効な状態と無効な状態を比較しましたが、}
&b(){こちらも全く差は検出されませんでした。}
ちなみにこのAPIは[[(Microsoft Developer Network) IDXGIDevice1::SetMaximumFrameLatency method>>http://msdn.microsoft.com/en-us/library/windows/desktop/ff471334(v=vs.85).aspx]]ですが、
ディフォルト(このAPIを使っていない場合を含む)は3フレームになっていますね。
尚、Windows7まではアプリケーション内部からDWM(Windows Aero)を無効にすることが可能ですので、
そのためのAPIを呼び出すことでも遅延回避が可能です。
----
***■そもそもの遅延
&b(){&color(red){DirectXアプリケーションではOSやDirectXのバージョンを問わず、常に1フレームは遅延が発生します。}}
&b(){&color(red){従って、上記APIを使用し、許容する最大遅延フレーム数を1に設定すると、}}
&b(){&color(red){最小遅延での描画が行われるため、Windows Aeroなどによる遅延が解消されます。}}
&b(){尚、上記APIの説明にも記載されていますが0を指定出来ません。
----
***■でも
&b(){描画開始以前にアプリケーション内部で大きな遅延が発生しているみたいです。}
&b(){本件はWindows7/8に関係なく平等に発生しているため、本調査の対象外と致します。}
恐らく「ネットワークコード」などと呼ばれるクライアント/サーバ間の状態同期処理などの影響に拠るものと考えられます。
----
***■本日は手軽な説明
&b(){実際の作業はDWM(Windows Aero)関連APIの挙動とDirectXアプリケーションが受ける影響を把握するため、}
&b(){試験用の小さなDirectXアプリケーションを用意しました。}
&b(){このアプリケーションはあくまでも私が遅延の原因やそれに纏わる問題を理解することが目的ですので、}
&b(){ここで説明のために用いる必要はないのですが次回にでも簡単な説明と共に、遊びたい方には配布致します。}
今日はもう寝る時間なので。
----
***■2大秘密兵器
&b(){かなり原始的なローテクツールですが、この2つだけで見てわかる証拠がいくらでも確保出来ました。}
&b(){1.光るマウス}
&image(MouseWithCircuit_20131027.jpg)
&b(){裏側が可視光レーザで光るマウスはどこにでもありますが、ケーブルの先が光るマウスはたぶん世界初。}
&b(){家電量販店で買ってきた980円のマイクロソフトマウスはこんな目に遭うとは思ってもみなかったでしょう。}
&b(){さて、用途ですが、単純明快。}
&b(){&color(red){左ボタンがクリックされている間、3連赤色LEDが点灯します。}}
&b(){それだけ。}}
&b(){マウスクリック開始から液晶モニタにアクションの結果が反映されるまでの時間が、}
&b(){プレイヤーによって認知される遅延時間になります。}
&b(){マウスクリックの瞬間と影響モニタにアクションが表示される瞬間を撮影出来れば、}
&b(){2枚の映像の時間差から遅延時間を容易に割り出すことが出来ます。
&b(){しかし、残念なことにマウスのクリックを動画で記録することは激しく困難。}
&b(){ボタンのストローク量が1mmも無いため、どのタイミング(フレーム)でボタンがONになったのかが判然としません。}
&b(){「ボタンを押したタイミングをそんなに正確に知る必要があるのか?」ですって??}
&b(){いやいやいや、仮にクリックに0.1秒かかったとしましょう。}
&b(){つまり、マウスのボタンが上がっている状態から、押下されて一番下に到着するまで0.1秒です。}
&b(){しかし、その0.1秒のうちどのタイミングでONになったのかわかりません。}
&b(){0.1秒なんて誤差。そんなわけない。60fpsの環境なら0.1秒で6フレームも進んでしまいます。}
&b(){1フレームの遅延を調べたいのに6フレームの誤差なんて論外もいいところ。}
&b(){&color(red){そこでマウスボタンがONになった瞬間にLEDを光らせることにより、}}
&b(){&color(red){時間計測の開始タイミングを容易に把握出来るようにする発想。}}
&b(){極めて単純ですが効果覿面でした。}
&b(){ちなみに電子回路にはトランジスタ2つとLED3つが使用されていますが、}
&b(){それらの反応時間はマイクロ秒オーダなので誤差として無視出来る範囲です。}
&b(){2.高速度デジタルカメラ}
&b(){秘密兵器と申し上げるのもどうかと思うぐらい普通に販売されている、}
&b(){CASIOのHighSpeed EXILIMシリーズのうちの一機種を使用しました。}
&b(){仕様上は1,000フレーム/秒の高速撮影が可能ですが、速度を上げるほど画質が劣化するため}
&b(){&color(red){今回は240フレーム/秒にて撮影を行っています。}
----
***大量に撮影したウチの1シーンのみ本日は公開
&b(){画像は240フレーム/秒で撮影した動画を静止画に変換しています。}
&b(){従って、フレーム間の経過時間は約4.167msとなり、
&b(){&color(&color(red){静止画4枚で60fps環境に於ける画面の1フレームに相当します。}
----
***測定前提
&b(){OS:Windows7 SP1}
&b(){DWM:Disabled}
&b(){WindowMode:FullScreen}
&b(){VSync:Disabled}
&b(){恐らく最も多く使われている構成です。}
&b(){Windows7かつDWM(Windows Aero)が無効になっており、V-Syncも無効ですので最速の応答状態にあります。}
&b(){尚、ゲーム内のフレームレートはVSyncを使用していませんが、ほぼ60fpsになるよう負荷を調整しています。}
&b(){また、撮影に使用した液晶モニタはEIZO EV2436W (60Hz/応答時間6ms)になります。}
----
***ではいってみよう
&b(){射撃準備中1枚目}
&b(){上からぶら下がっている赤い変なものが3連LEDです。}
&b(){マウスクリックに反応し瞬時に点灯します。}
&image(Latency_X-01.jpg)
&b(){射撃準備中2枚目}
&b(){まだクリックしていないためLEDが光りません。}
&image(Latency_X-02.jpg)
&b(){射撃準備中3枚目}
&b(){まだクリックしていないためLEDが光りません。そろそろ撃てと。}
&image(Latency_X-03.jpg)
&b(){&color(red){発射}}
&b(){LED点灯。左ボタンがクリックされた瞬間です。}
&image(Latency_Triggered.jpg)
&b(){射撃後1枚目/クリックから4.167ms経過}
&b(){変化無し。}
&image(Latency_X+01.jpg)
&b(){射撃後2枚目/クリックから8.333ms経過}
&b(){変化無し。}
&image(Latency_X+02.jpg)
&b(){射撃後3枚目/クリックから12.500ms経過}
&b(){変化無し。}
&image(Latency_X+03.jpg)
&b(){射撃後4枚目/クリックから16.667ms経過}
&b(){&color(red){60fps環境に於ける1フレーム分の時間が経過。}}
&image(Latency_X+04.jpg)
&b(){射撃後5枚目/クリックから20.833ms経過}
&b(){変化無し。}
&image(Latency_X+05.jpg)
&b(){射撃後6枚目/クリックから25.000ms経過}
&b(){変化無し。}
&image(Latency_X+06.jpg)
&b(){射撃後7枚目/クリックから29.167ms経過}
&b(){変化無し。}
&image(Latency_X+07.jpg)
&b(){射撃後8枚目/クリックから33.333ms経過}
&b(){&color(red){60fps環境に於ける2フレーム分の時間が経過。}}
&b(){少々意外ですが、すぐには弾が飛んでいかないようです。}
&image(Latency_X+08.jpg)
&b(){射撃後9枚目/クリックから37.500ms経過}
&b(){変化無し。}
&image(Latency_X+09.jpg)
&b(){射撃後10枚目/クリックから41.667ms経過}
&b(){変化無し。}
&image(Latency_X+10.jpg)
&b(){射撃後11枚目/クリックから45.833ms経過}
&b(){変化無し。}
&image(Latency_X+11.jpg)
&b(){射撃後12枚目/クリックから50.000ms経過}
&b(){&color(red){60fps環境に於ける3フレーム分の時間が経過。}}
&b(){3フレーム遅延って、普通に撃っても3フレーム遅延してますよ。}
&image(Latency_X+12.jpg)
&b(){射撃後13枚目/クリックから54.167ms経過}
&b(){変化無し。そろそろ変化して欲しい。}
&image(Latency_X+13.jpg)
&b(){射撃後14枚目/クリックから58.333ms経過}
&b(){変化無し。だんだん心配になってくる頃。}
&image(Latency_X+14.jpg)
&b(){射撃後15枚目/クリックから62.500ms経過}
&b(){変化無し。何かがバグってる可能性あり。}
&image(Latency_X+15.jpg)
&b(){射撃後16枚目/クリックから66.667ms経過}
&b(){&color(red){60fps環境に於ける4フレーム分の時間が経過。}}
&b(){3フレーム遅延で済むならまだ良かったかも。}
&image(Latency_X+16.jpg)
&b(){射撃後17枚目/クリックから70.833ms経過}
&b(){変化無し。弾切れか?}
&image(Latency_X+17.jpg)
&b(){射撃後18枚目/クリックから75.000ms経過}
&b(){&color(red){やっと飛んだ!!}}
&image(Latency_Fired.jpg)
&b(){射撃後19枚目/クリックから79.167ms経過}
&image(Latency_Fired+01.jpg)
&b(){射撃後20枚目/クリックから83.333ms経過}
&image(Latency_Fired+02.jpg)
----
***見ての通り、3フレーム遅延など起らなくても4.5フレームの遅延が発生していました
&b(){ちなみにV-Syncが有効になっていると&color(red){なんと、8フレームもの遅延}となるケースもありました。}}
&b(){繰り返しますが、この映像はWindows7にてDWM(Windows Aero)を無効にした状態で撮影していますので、}
&b(){問題の3フレーム遅延が発生しているわけではありません。}
イマイチな感じのBattlefield3ですが、
これは全員平等の現象ですので有利不利に繋がることは無いでしょう。
でも偏差射撃が必要なシーンでは結構影響が大きそうですね。
2年も経ってから言うのもなんですが。(苦笑)
----
詳細な比較は次回に。
(&Counter())
**3フレーム遅延問題 5
せっせと作業完了。
----
***■暫定的な結論から
&b(){はやく出せとの圧力が凄いので取り敢えずBattlefield3を例に挙げますと...}
&b(){あらゆる画面設定に於いて、大きな入力遅延が生じています。}
&b(){但し、画面設定が同様であればWindows7とWindows8にて遅延の程度に差は全くありません。}
&b(){&color(red){従って「Windows8は3フレーム遅延する」はBattlefield3に限定すれば間違いと断定出来ます。}}
----
***■既成概念的前提
&b(){この問題に関する重要なポイントをまとめると下記の通りとなります。}
&b(){1.Windows Aeroが有効になっているとアプリケーションの描画が3フレーム遅延する}
&b(){2.Windows8ではWindows Aeroが無効に出来ない}
&b(){3.上記1.及び2.によりWindows8ではアプリケーションの描画が3フレーム遅延する}
鮮やかな三段論法です。
----
***■不足
&b(){絶望的に見える上記前提には二つの重要な要素が欠けています。}
&b(){A.3フレームの遅延はあくまでも最大であり常に3フレーム遅延するわけではない}
&b(){&color(red){B.DirectXアプリケーションはアプリケーション内で最大遅延フレーム数を指定出来る}}
&b(){もう説明の必要も無いと思いますが、Battlefield3内部にてB.の処理が実施されていると考えられます。}
&b(){そして、Windows7にてWindows Aeroが有効な状態と無効な状態を比較しましたが、}
&b(){こちらも全く差は検出されませんでした。}
ちなみにこのAPIは[[(Microsoft Developer Network) IDXGIDevice1::SetMaximumFrameLatency method>>http://msdn.microsoft.com/en-us/library/windows/desktop/ff471334(v=vs.85).aspx]]ですが、
ディフォルト(このAPIを使っていない場合を含む)は3フレームになっていますね。
尚、Windows7まではアプリケーション内部からDWM(Windows Aero)を無効にすることが可能ですので、
そのためのAPIを呼び出すことでも遅延回避が可能です。
----
***■そもそもの遅延
&b(){&color(red){DirectXアプリケーションではOSやDirectXのバージョンを問わず、常に1フレームは遅延が発生します。}}
&b(){&color(red){従って、上記APIを使用し、許容する最大遅延フレーム数を1に設定すると、}}
&b(){&color(red){最小遅延での描画が行われるため、Windows Aeroなどによる遅延が解消されます。}}
&b(){尚、上記APIの説明にも記載されていますが0は指定出来ません。}
----
***■でも
&b(){描画開始以前にアプリケーション内部で大きな遅延が発生しているみたいです。}
&b(){本件はWindows7/8に関係なく平等に発生しているため、本調査の対象外と致します。}
恐らく「ネットワークコード」などと呼ばれるクライアント/サーバ間の状態同期処理などの影響に拠るものと考えられます。
----
***■本日は手軽な説明
&b(){実際の作業はDWM(Windows Aero)関連APIの挙動とDirectXアプリケーションが受ける影響を把握するため、}
&b(){試験用の小さなDirectXアプリケーションを用意しました。}
&b(){このアプリケーションはあくまでも私が遅延の原因やそれに纏わる問題を理解することが目的ですので、}
&b(){ここで説明のために用いる必要はないのですが次回にでも簡単な説明と共に、遊びたい方には配布致します。}
今日はもう寝る時間なので。
----
***■2大秘密兵器
&b(){かなり原始的なローテクツールですが、この2つだけで見てわかる証拠がいくらでも確保出来ました。}
&b(){1.光るマウス}
&image(MouseWithCircuit_20131027.jpg)
&b(){裏側が可視光レーザで光るマウスはどこにでもありますが、ケーブルの先が光るマウスはたぶん世界初。}
&b(){家電量販店で買ってきた980円のマイクロソフトマウスはこんな目に遭うとは思ってもみなかったでしょう。}
&b(){さて、用途ですが、単純明快。}
&b(){&color(red){左ボタンがクリックされている間、3連赤色LEDが点灯します。}}
&b(){それだけ。}
&b(){マウスクリック開始から液晶モニタにアクションの結果が反映されるまでの時間が、}
&b(){プレイヤーによって認知される遅延時間になります。}
&b(){マウスクリックの瞬間と影響モニタにアクションが表示される瞬間を撮影出来れば、}
&b(){2枚の映像の時間差から遅延時間を容易に割り出すことが出来ます。}
&b(){しかし、残念なことにマウスのクリックを動画で記録することは激しく困難。}
&b(){ボタンのストローク量が1mmも無いため、どのタイミング(フレーム)でボタンがONになったのかが判然としません。}
&b(){「ボタンを押したタイミングをそんなに正確に知る必要があるのか?」ですって??}
&b(){いやいやいや、仮にクリックに0.1秒かかったとしましょう。}
&b(){つまり、マウスのボタンが上がっている状態から、押下されて一番下に到着するまで0.1秒です。}
&b(){しかし、その0.1秒のうちどのタイミングでONになったのかわかりません。}
&b(){0.1秒なんて誤差。そんなわけない。60fpsの環境なら0.1秒で6フレームも進んでしまいます。}
&b(){1フレームの遅延を調べたいのに6フレームの誤差なんて論外もいいところ。}
&b(){&color(red){そこでマウスボタンがONになった瞬間にLEDを光らせることにより、}}
&b(){&color(red){時間計測の開始タイミングを容易に把握出来るようにする発想。}}
&b(){極めて単純ですが効果覿面でした。}
&b(){ちなみに電子回路にはトランジスタ2つとLED3つが使用されていますが、}
&b(){それらの反応時間はマイクロ秒オーダなので誤差として無視出来る範囲です。}
&b(){2.高速度デジタルカメラ}
&b(){秘密兵器と申し上げるのもどうかと思うぐらい普通に販売されている、}
&b(){CASIOのHighSpeed EXILIMシリーズのうちの一機種を使用しました。}
&b(){仕様上は1,000フレーム/秒の高速撮影が可能ですが、速度を上げるほど画質が劣化するため}
&b(){&color(red){今回は240フレーム/秒にて撮影を行っています。}}
----
***大量に撮影したウチの1シーンのみ本日は公開
&b(){画像は240フレーム/秒で撮影した動画を静止画に変換しています。}
&b(){従って、フレーム間の経過時間は約4.167msとなり、}
&b(){&color(&color(red){静止画4枚で60fps環境に於ける画面の1フレームに相当します。}}
----
***測定前提
&b(){OS:Windows7 SP1}
&b(){DWM:Disabled}
&b(){WindowMode:FullScreen}
&b(){VSync:Disabled}
&b(){恐らく最も多く使われている構成です。}
&b(){Windows7かつDWM(Windows Aero)が無効になっており、V-Syncも無効ですので最速の応答状態にあります。}
&b(){尚、ゲーム内のフレームレートはVSyncを使用していませんが、ほぼ60fpsになるよう負荷を調整しています。}
&b(){また、撮影に使用した液晶モニタはEIZO EV2436W (60Hz/応答時間6ms)になります。}
----
***ではいってみよう
&b(){射撃準備中1枚目}
&b(){上からぶら下がっている赤い変なものが3連LEDです。}
&b(){マウスクリックに反応し瞬時に点灯します。}
&image(Latency_X-01.jpg)
&b(){射撃準備中2枚目}
&b(){まだクリックしていないためLEDが光りません。}
&image(Latency_X-02.jpg)
&b(){射撃準備中3枚目}
&b(){まだクリックしていないためLEDが光りません。そろそろ撃てと。}
&image(Latency_X-03.jpg)
&b(){&color(red){発射}}
&b(){LED点灯。左ボタンがクリックされた瞬間です。}
&image(Latency_Triggered.jpg)
&b(){射撃後1枚目/クリックから4.167ms経過}
&b(){変化無し。}
&image(Latency_X+01.jpg)
&b(){射撃後2枚目/クリックから8.333ms経過}
&b(){変化無し。}
&image(Latency_X+02.jpg)
&b(){射撃後3枚目/クリックから12.500ms経過}
&b(){変化無し。}
&image(Latency_X+03.jpg)
&b(){射撃後4枚目/クリックから16.667ms経過}
&b(){&color(red){60fps環境に於ける1フレーム分の時間が経過。}}
&image(Latency_X+04.jpg)
&b(){射撃後5枚目/クリックから20.833ms経過}
&b(){変化無し。}
&image(Latency_X+05.jpg)
&b(){射撃後6枚目/クリックから25.000ms経過}
&b(){変化無し。}
&image(Latency_X+06.jpg)
&b(){射撃後7枚目/クリックから29.167ms経過}
&b(){変化無し。}
&image(Latency_X+07.jpg)
&b(){射撃後8枚目/クリックから33.333ms経過}
&b(){&color(red){60fps環境に於ける2フレーム分の時間が経過。}}
&b(){少々意外ですが、すぐには弾が飛んでいかないようです。}
&image(Latency_X+08.jpg)
&b(){射撃後9枚目/クリックから37.500ms経過}
&b(){変化無し。}
&image(Latency_X+09.jpg)
&b(){射撃後10枚目/クリックから41.667ms経過}
&b(){変化無し。}
&image(Latency_X+10.jpg)
&b(){射撃後11枚目/クリックから45.833ms経過}
&b(){変化無し。}
&image(Latency_X+11.jpg)
&b(){射撃後12枚目/クリックから50.000ms経過}
&b(){&color(red){60fps環境に於ける3フレーム分の時間が経過。}}
&b(){3フレーム遅延って、普通に撃っても3フレーム遅延してますよ。}
&image(Latency_X+12.jpg)
&b(){射撃後13枚目/クリックから54.167ms経過}
&b(){変化無し。そろそろ変化して欲しい。}
&image(Latency_X+13.jpg)
&b(){射撃後14枚目/クリックから58.333ms経過}
&b(){変化無し。だんだん心配になってくる頃。}
&image(Latency_X+14.jpg)
&b(){射撃後15枚目/クリックから62.500ms経過}
&b(){変化無し。何かがバグってる可能性あり。}
&image(Latency_X+15.jpg)
&b(){射撃後16枚目/クリックから66.667ms経過}
&b(){&color(red){60fps環境に於ける4フレーム分の時間が経過。}}
&b(){3フレーム遅延で済むならまだ良かったかも。}
&image(Latency_X+16.jpg)
&b(){射撃後17枚目/クリックから70.833ms経過}
&b(){変化無し。弾切れか?}
&image(Latency_X+17.jpg)
&b(){射撃後18枚目/クリックから75.000ms経過}
&b(){&color(red){やっと飛んだ!!}}
&image(Latency_Fired.jpg)
&b(){射撃後19枚目/クリックから79.167ms経過}
&image(Latency_Fired+01.jpg)
&b(){射撃後20枚目/クリックから83.333ms経過}
&image(Latency_Fired+02.jpg)
----
***見ての通り、3フレーム遅延など起らなくても4.5フレームの遅延が発生していました
&b(){ちなみにV-Syncが有効になっていると&color(red){なんと、8フレームもの遅延}となるケースもありました。}
&b(){繰り返しますが、この映像はWindows7にてDWM(Windows Aero)を無効にした状態で撮影していますので、}
&b(){問題の3フレーム遅延が発生しているわけではありません。}
イマイチな感じのBattlefield3ですが、
これは全員平等の現象ですので有利不利に繋がることは無いでしょう。
でも偏差射撃が必要なシーンでは結構影響が大きそうですね。
2年も経ってから言うのもなんですが。(苦笑)
----
詳細な比較は次回に。
(&Counter())
表示オプション
横に並べて表示:
変化行の前後のみ表示: