Direct3D Driver Model (0)

『さいけでりっく☆さんどいっち』より.

レンダーステートの変更はコストがかかるので極力避けるようにしましょう、というのはDrawXXX()系と共にバッチ処理として前から言われてことだけど、ドキュメントの『Direct3D API 呼び出しの正確なプロファイル』を見ていたら、今まで勘違いしていたことが発覚。RenderState等の呼び出しそのものにコストがかかるのではなく、ステートを変更することでDrawXXX()系の描画コマンド発行にコストがかかるのね。

Accurately Profiling Direct3D API CallsDirectX Graphics のパフォーマンスについて書かれた資料の中ではもっとも役に立つもののひとつでしょう*1.このような情報が SDK 付属ドキュメントとして公開されることすらなかった時代に比べると夢のような話です.また翻訳が「Microsoft DirectX 9.0 Update (October 2004) 日本語ドキュメント」に含まれているというのもうれしい点ですが,Web から直接参照することが出来ないので掲示板などからリンクを張るときにちょっと困るんですよね.

まーバッチ処理もCPUが豪勢な今は、神経質になりすぎると逆効果だったり設計が崩れたりするのでよくないんだろうけど、チップベンダーの資料にいまだに言及されているのは、やはりDirectXのドライバモデルが腐ってて俺たち側じゃどうにもなりませんよーということなのかしら。WGFはこのへんが改善されるらしいけど、さて?

「CPUが豪勢な今は」というのは微妙なところで,むしろ過去数年間でCPU律速になることが増えてきたために詳細なプロファイリングが必要となってきたという印象が強いです.「チップベンダーの資料にいまだに言及されている」についても,まさにここ数年どんどん声が大きくなっているんじゃないでしょうか.これは単純にDirectXのドライバモデルの問題だけとは言えません*2NVIDIA なんかは「GPUとCPUの性能向上速度に差があることから,年々その速度差が拡大していくことが問題だ」なんてよく言っていますね.ちなみに3年前の資料ですらこんなことを言っているので,今はもっと発言が過激になってたりして.DirectX のドライバモデルを問題視する発言が増えたのは案外そういう流れかもしれません.

“All games are CPU limited”- That’s over 80% of games that I see

また最適化のための自由度が多すぎるという問題にどう対処するかですが,例えば1)宣言型のレンダリング記述言語を導入し,2)それから導かれる複数の実行プランから最適なものを選択する,というものが考えられます.最適な手法の選択はデータの統計にも依存するため,そういった厄介な依存性をソースコードに持ち込んでしまうのは得策ではありません.現在 RDBMS で実現できているようなことが(id:NyaRuRu:20050212:p1)今後数年の内に 3D 描画についても利用可能になるといいんですけどね.

*1:Meltdown 2004 講演スライドのThe CPU Aspect of the D3D Pipeline も読んでおくと吉.

*2:ちなみに DirectX のドライバモデルで問題だったのは要するに「スケーラビリティが無かったこと」でしょう.「モデル」自体はストリームI/O系でよく見られる代物に見えます.