Windowsデスクトップアプリケーションの開発プラットフォームである「Windows Forms」と「WPF」を比較したときに、大きく異なるのが描画の仕組みです。今回の記事では、Windows FormsとWPFそれぞれの描画の仕組みについて簡単に解説したいと思います。
描画の基盤技術の違い
Windows Formsの描画の基盤技術は「GDI(Graphics Device Interface)」、または「GDI+」です。
これに対し、WPFでは「Direct3D」という3Dグラフィックスを描画するためのAPIを介してグラフィックの描画を行います。可能な限りGPUによるハードウェアアクセラレーションが行われるので、GDI/GDI+と比較して、CPUへの負担も軽減できます。
GDIは長い年月をかけて多くの改善が行われてきましたが、その起源は初期のWindowsまでさかのぼります。
Windows FormsとWPFを単純に比較すれば、その誕生時期はわずか4年ほどしか違いがありません。しかし、ベクターベースの描画基盤の上に全く新たに構築されたGUIシステムであるWPFと、20年以上前から引き継がれてきているGDIベースのGUIシステムであるWindows Forms、と捉えれば、いかに大きな差が存在しているかを実感できるのではないでしょうか。
即時モードと保持モード
Windows Formsの基盤描画技術となるGDIの場合、最終的なビデオメモリに書き込んでいるのはアプリケーション自身です。すなわち、アプリケーションが実行する描画命令と実画面のフレームバッファに書き込まれるタイミングは同期しています。このような描画の仕組みを「即時モード」のグラフィックシステムと言います。
一方WPFの場合、アプリケーションから描画命令を実行してもビジュアルオブジェクトをシリアル化した描画データが生成されるだけで、そのまま即ビデオメモリへの書き込みは行われません。アプリケーションの実行スレッドとは別のWPFの描画スレッドが、描画データをスキャンして非同期にDirect3Dのバッファに描画します。このような描画の仕組みを「保持モード」のグラフィックシステムと言います。
WPFの保持モードグラフィックシステムの優位性
WPFの保持モードのグラフィックシステムは、Windows Formsの即時モードに比べて具体的にどのような優位性を持っているのでしょうか。
即時モードのグラフィックシステムでは、最終的な描画のタイミングをアプリケーション自身が握っているため、描画途中でディスプレイ更新が行われると意図していない崩れた描画が表示されてしまうことがあります。
例えば以下のように多量のコントロールを配置した画面をWindows Formsで作成します。
これを高速でスクロールすると、以下のように、意図しない乱れた描画結果が表示されてしまいます。
一方、保持モードのグラフィックシステムでは、最終的な描画のタイミングはWPFの描画エンジンが握っているため、最終的な描画のタイミングをディスプレイの更新タイミングに合わせることが可能です。そのため、意図していない描画がディスプレイに表示されることはありません。
WPFで先ほどのWindows Formsと同様の構成の画面を作成し、高速でスクロールしても、以下のようになめらかに表示できます。
WPFは短時間にどれだけ多くの描画を行えるかではなく、いかに流れを止めないように連続的な描画を行うかを実現するためのパフォーマンス特性を持っているのです。
WPFプラットフォームの優位性とは?
以下でWindowsデスクトップアプリケーション開発におけるWPFプラットフォームの優位性をまとめたページを公開しています。
WPFの開発を効率化するコンポーネントもご紹介しているので、ぜひご覧ください。