none
WindowのAllowsTransparencyをtrueにするとアニメーションが重くなる RRS feed

  • 質問

  • はじめまして.

    VSUG(http://vsug.jp/tabid/63/forumid/51/postid/9996/view/topic/Default.aspx)で質問をしたのですが返信が無かったため,こちらでお願いいたします.

    質問の内容なのですが,WPFアプリを作る際にWindowのAllowsTransparencyをtrueにすると透明度などのアニメーションをさせたときにスムーズに変化しなくなるという問題です.

    自分で色々実験してみたところウィンドウサイズが小さいとこの現象が発生しないことはわかりました.ウィンドウサイズを大きくしていくと徐々に動きが悪くなるという感じです.

    Perfotatorではハードウェアレンダリングされていると表示されますが,フレームレートが,ウィンドウが小さいときは57,大きいときは10程度になっていました.

    最新のWindowsSDKに付属のドキュメントに入っている"四角形以外のウィンドウのサンプル"のプログラムでも同様の現象が発生しました.

    これはWPFの仕様なのでしょうか?

    2007年6月21日 6:27

回答

  •  mito さんからの引用

    これはWPFの仕様なのでしょうか?

     

    この件については WPF のリリース前から改善を望む声が多かったのですが,残念ながら現状の WPF では仕様ということになります.議論は主に英語圏で行われていて,開発者の blog やオンラインフォーラムをあさればいろいろ出てくるかと思います.

     

     mito さんからの引用

    Perfotatorではハードウェアレンダリングされていると表示されますが,フレームレートが,ウィンドウが小さいときは57,大きいときは10程度になっていました.

     

    ハードウェアのレンダーターゲットを使うことと,ソフトウェアによってイメージが作成されないことは必ずしも同値ではないので,やはり CPU 処理されている部分が足を引っ張っているという理解で良いかと思います.

    これはしばしば誤解される点でもありますが,WPF のイメージ生成系すべてが GPU によって処理されているわけではありません.たとえば WPF はスプライン曲線を扱えますが,Direct3D にはこういった曲線を描画する機能は存在しません.ではどうやって描画しているかというと,いったん CPU 処理によってピクセルイメージを生成し,それを VRAM 上のテクスチャに転送し,Direct3D の命令を使って 2D イメージとして合成します.この最終的な合成処理は,確かにハードウェアアクセラレーションが行われるので,「GPU の機能を使って高速化している」という表現は嘘ではないのですが,すべての描画が GPU によって行われるというのはよくある誤解です.

    また,WPF は影をつけたりグレア処理を行ったりといったピクセルエフェクト (BitmapEffect) も CPU によって行われており,トータルスループット (FPS) が CPU 律速になりやすい部分です(参考『BitmapEffectは静的に使う(RenderTargetBitmap)』).

    このように,WPF におけるハードウェアレンダリングの概念は誤解を受けやすいことに注意してください.

    2007年6月23日 3:41

すべての返信

  • WPFのHELPの「グラフィックスの描画層」に以下のようにあります。

     

    「描画層 1 では、以下の機能はハードウェアによって加速されません。」、 (描画層 2も同じ) の中に、

     

    レイアード ウィンドウ

     

    レイアード ウィンドウを使用すると、WPF アプリケーションで、コンテンツを四角形以外のウィンドウの画面に描画できます。Windows Vista では、レイアード ウィンドウはハードウェアによって加速されます。Windows XP などのその他のシステムでは、レイアード ウィンドウはハードウェアによる加速を使用せずにソフトウェアで描画されます。

    WPF でレイアード ウィンドウを有効にするには、Window の次のプロパティを設定します。

    • WindowStyle = None

    • AllowsTransparency = true

    • Background = Transparent

    つまり、Windows Vistaではハードウェアによって加速され、Windows XP ではソフトウェアで描画されるということですね。

     

    レイアード ウィンドウがハードウェアによって加速されても遅いのが仕様がどうかはわかりません。

    2007年6月22日 17:06
  •  mito さんからの引用

    これはWPFの仕様なのでしょうか?

     

    この件については WPF のリリース前から改善を望む声が多かったのですが,残念ながら現状の WPF では仕様ということになります.議論は主に英語圏で行われていて,開発者の blog やオンラインフォーラムをあさればいろいろ出てくるかと思います.

     

     mito さんからの引用

    Perfotatorではハードウェアレンダリングされていると表示されますが,フレームレートが,ウィンドウが小さいときは57,大きいときは10程度になっていました.

     

    ハードウェアのレンダーターゲットを使うことと,ソフトウェアによってイメージが作成されないことは必ずしも同値ではないので,やはり CPU 処理されている部分が足を引っ張っているという理解で良いかと思います.

    これはしばしば誤解される点でもありますが,WPF のイメージ生成系すべてが GPU によって処理されているわけではありません.たとえば WPF はスプライン曲線を扱えますが,Direct3D にはこういった曲線を描画する機能は存在しません.ではどうやって描画しているかというと,いったん CPU 処理によってピクセルイメージを生成し,それを VRAM 上のテクスチャに転送し,Direct3D の命令を使って 2D イメージとして合成します.この最終的な合成処理は,確かにハードウェアアクセラレーションが行われるので,「GPU の機能を使って高速化している」という表現は嘘ではないのですが,すべての描画が GPU によって行われるというのはよくある誤解です.

    また,WPF は影をつけたりグレア処理を行ったりといったピクセルエフェクト (BitmapEffect) も CPU によって行われており,トータルスループット (FPS) が CPU 律速になりやすい部分です(参考『BitmapEffectは静的に使う(RenderTargetBitmap)』).

    このように,WPF におけるハードウェアレンダリングの概念は誤解を受けやすいことに注意してください.

    2007年6月23日 3:41
  • えムナウさん,NyaRuRuさん回答ありがとうございます.

    現時点ではAllowsTransparency=trueの状態でスムーズにアニメーションさせることはできないということですね.CPUが計算を行っている部分がそれほど多いとは思いませんでした.

    海外のサイトを検索したところ,

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1378122&SiteID=1

    http://blogs.msdn.com/jaimer/archive/2006/12/08/transparent-windows-in-wpf-please-make-them-small.aspx

    などがヒットしました.

    せっかくWPFによってアニメーションなどのエフェクトが簡単に扱えるようになったのに残念です.Microsoftには早くこの問題に対応してほしいですね.

    2007年6月23日 9:14
  •  mito さんからの引用

    せっかくWPFによってアニメーションなどのエフェクトが簡単に扱えるようになったのに残念です.Microsoftには早くこの問題に対応してほしいですね.

     

    ちなみに,最も厄介な問題は,Win32 API で実装されている Layered Windows には,Direct3D のサーフェイスから直接アルファ値を設定する方法が無いということです.例えば,Windows 2000 や Windows XP で Direct3D アプリケーションを作成するとして,Direct3D によって描画されたアルファ情報を,CPU とメインメモリを介さずにレイヤードウィンドウに設定することはできません.

     

    現在最も現実的な方法で Windows XP の AllowsTransparency のパフォーマンスを改善するには,サービスパックなどで OS に新しい API を追加し,もしかしたらドライバにも一定の追加条件を課すことになるのではないかと思います(XP 時代のレイヤードウィンドウは,ハードウェアで合成されることが保証されていなかったため).Microsoft もこの問題を認識していなかったわけではなく,随分と対応を検討したようですが,少なくとも初期バージョンでの対応が見送られた背景には,こういった歴史的経緯がかなり影響しているようです.

    一方で,Windows Vista 以降で,Desktop Window Manager (DWM) 使用時にのみパフォーマンスを改善するにとどめるのであれば,比較的簡単に対応できるのではないかと思います.実際 DWM のバグらしき挙動を利用して,Direct3D によって描画されたアルファ情報を使った半透明ウィンドウ合成なら成功したことがあります.

    2007年6月23日 14:25
  •  NyaRuRu さんからの引用

    現在最も現実的な方法で Windows XP の AllowsTransparency のパフォーマンスを改善するには,サービスパックなどで OS に新しい API を追加し,もしかしたらドライバにも一定の追加条件を課すことになるのではないかと思います(XP 時代のレイヤードウィンドウは,ハードウェアで合成されることが保証されていなかったため).Microsoft もこの問題を認識していなかったわけではなく,随分と対応を検討したようですが,少なくとも初期バージョンでの対応が見送られた背景には,こういった歴史的経緯がかなり影響しているようです.

     

    追記です.

    私も完全に把握しているわけではありませんが,問題になっている箇所の一部について,Microsoft は d3d9.dll の変更で対応する方向にあるように見えます.ご参考までに.

    KB 937106 : Performance is poor in a WPF-based application in which you have enabled layered windows in Windows XP or in Windows Server 2003

    2007年7月17日 4:09
  • やはり,もうすぐレイヤードウィンドウのハードウェアアクセラレーションが実現されるようです.

     

    Tim Sneath : What's New in WPF 3.5? Here's Fifteen Cool Features...』より.

    • Performance
      • Fixed animation glitching issues.
      • Layered windows are now hardware accelerated.
      • Many other fixes to improve cold start, data binding, etc. 
    2007年8月9日 23:55