D3D9 as a 2D drawing foundation

6uNで導入された機能のなかでも特にWindowsプラットフォームでの性能向上が見込めるものがDirect3DベースのJava2Dパイプライン機能だ。これはWindowsプラットフォームでデフォルトで有効になる機能で、ハードウェアがPixel Shaders 2.0の必要最小限の機能をサポートしている場合に、Swingコンポーネントにおける透過処理、傾き処理、任意の変換、そのほか2D描画機能に対してハードウェアアクセラレーション機能が活用される。

時間ができたら PIX for Windows で眺めてみたいんですが,中々時間が……ってソースを読めばよいのかな?



ちなみに Direct3D による 2D アクセラレーションというのは誤解されやすいので気をつけたいところ.
内部では (多分) こんな順序で描画しています.

  1. 適当な描画単位 (パーツ) ごとにメインメモリ上に CPU 描画
  2. パーツごとにテクスチャにキャッシュ
  3. バックバッファの上に DrawPrimitive でパーツを合成していく (アフィン変換, アルファ合成,PixelShader によるエフェクト)

とまあ結局転送元画像はソフトウェアレンダラで描くのが一般的です.この辺の事情を見ても,Windows Vista での GDI 完全ソフトウェア化はいいタイミングだったと思います.結局単独の図形を低レイテンシで作るのであればソフトウェアレンダラがベストというのが昨今の Windows の 2D 描画事情です.
最近 Direct3D による 2D アクセラレーションなんて言っているグループが,どこもそれなりに体力と歴史のあるグループというのは,偶然ではありません.まず CPU によるベクタベース 2D レンダラを完成させて,次に VRAM へのキャッシュと DrawPrimitive 時の自由度による高速化を目指す必要があるわけで,その域に達するのは割と大変です.
WPF にしても 4〜5 年ぐらいコードをいじっていたんじゃないでしょうか? その WPF もソフトウェア描画で GDI+ のコードベースをかなりを流用しているそうですし*1,GDI+ まで遡れば 10 年近く続く一連のプロジェクトと言えるかもしれません.



しかしなんだかんだで Shader Model 2.0 という区切りは相当長生きしそうですね.Pixel Shader 2.0 対応のハードウェアの初出が 2002 年末から 2003 年頭にかけてなので*2,登場から既に 5 年経っている訳ですが,今ちょうどソフトウェアがその辺で線引きにかかっていると.
API セットは当面これで十分で,後は VRAM 容量がいい感じにスケールしていけばいいというのであれば,あと 5 年たってもそれなりに Direct3D9 は現役かもしれませんね.

*1:[http://blogs.msdn.com/timothyc/archive/2006/06/16/634638.aspx:title=WPF Graphics Performance Q & A - Q: Adding seemingly simple tweaks (e.g., clipping, bitmap effects) to our scene causes us to fall back to software, and software rending in WPF is slower than GDI+ software rendering.]

*2:[http://dench.flatlib.jp/dxlist.html:title=DirectXの歴史]