@IT 連載 .NET&Windows Vistaへ広がるDirectXの世界 (最終回)
紹介が遅くなりましたが,数日前から公開されてます.
http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld07/directxworld07_01.html:image:large
第7回 プログラマブル・シェーダによる積極的なGPUの活用
イントロにも書きましたが,元ネタは Shawn Hargreaves 氏の blog の マンデルブロ集合の記事 です.スクリーンショットだけを見ると静止画を作るサンプルと誤解されそうですが,リアルタイムで動くのがポイントです.動画を付けた方が本当はいいのかもしれませんね.
ちなみに「Aero がサクサク」という GPU でも,こういったサンプルで Xbox360 と競争させてみると Xbox360 圧勝というケースが多いのがわかります.いやほんと.速いですよ,Xbox360.
あとは,3 ページにわたって XNA 視点でのレンダリングパイプラインを一通り解説してみました.「玄関開けたら 5 分でゲーム製作」の精神とは逆行していると思いますが,せっかくの機会なので少し気合いを入れて書いてみています.2D 描画ユニットとして見た GPU の基礎知識なはずなのですが,意外とまとまった解説を見ないですからね.
裏話その 1
最初 1024 ループや 2048 ループで手元の PC と Xbox360 を比較していて,圧倒的な Xbox360 の速度に「Xbox360 はえー」と感動していたのですが,実は Xbox360 版のみ HLSL コンパイラによって勝手に 255 ループに打ち切られていたという罠 でした.127 ループで比較してもやはり Xbox360 の方が速かったのですが,速度差はまあ納得できる範囲内に.
裏話その 2
この記事はもともと Windows XP SP2 + Thinkpad T60 (ATI Mobility Radeon X1400) という環境で書いていたのですが,高解像度でループ回数を増やしていくと,PixelShader の処理時間が長くなりすぎてブルースクリーンになってしまうという目に何度も遭いました.幸い原稿の方は自動保存のおかげでロストすることはありませんでしたが,再起動とその後の NTFS のジャーナリングチェックだけでもずいぶんと時間を食われました.
これはプログラマブルシェーダに動的分岐が導入され,非常に長時間実行されるシェーダを書けるようになったことの弊害です.GPU がロックしてしまうと,ディスプレイに何か表示することすらできず,信頼性に関する重大な問題ということになります.
幸い,以前も紹介したよう*1に,Windows Vista で導入される WDDM では GPU にタイムアウト値が設定されており,その値を超えて GPU が応答を返さなければ GPU が "Reset" されるようになりました.
このタイムアウト値はデフォルトで 2 秒です.また,Direct3D 9Ex および Direct3D 10 では,"デバイス削除" に対応しておくことで,GPU リセット後にアプリケーションの復旧を行うことができます.
さて,Windows Vista に正式対応した XNA GSE 1.0 Refresh がリリースされ,うちの T60 も Windows Vista に模様替えとなりました.わくわくしながら XP でブルースクリーンになってしまった設定で大量のループを動かしてみると……結果は一面の赤.まあ現実はそんなものですな.
おまけ
XNA GSE 1.0 Refresh の GameThumbnail ですが,アルファチャンネルに対応しているようですね.参考までに記事で使ったものの元データ (psd) を置いておきます.
AQUA 風ボタンの作り方は,Life is beautiful の『色や大きさを後から変更できる AQUA風ボタンの作り方』を参考にさせていただきました.感謝.
*1:id:NyaRuRu:20061214:p4