開発用メモ

ビデオメモリとシステムメモリはどっちが高速か

速度的には以下のような順序になるようだ。

(高速)ビデオ→ビデオ > システム→システム >> システム⇔ビデオ(低速)

ビデオメモリにオフスクリーンサーフェスを置いて高速化されるのは
バックバッファなどからの単純な転送(DirectDrawSurface7.Bltなど)。

例えばFreeTrainの色相置換処理の場合、スプライトサーフェスをビデオメモリに置くと

1.ビデオ→システム(スプライトサーフェス読み取り)
2.ピクセル値加工
3.システム→ビデオ(プライマリサーフェス描きこみ)

となって、二回システム⇔ビデオ間転送が行われる。

スプライトサーフェスをシステムメモリに置くと

1.システム→システム(スプライトサーフェス読み取り)
2.ピクセル値加工
3.システム→ビデオ(プライマリサーフェス描きこみ)

のようにシステム⇔ビデオ間転送は一回に押さえられる。

FreeTrainの最新版では、デフォルトでスプライトサーフェスをシステムメモリに
配置するように設定されているが、実験では確かにシステムメモリに配置した方が
描画速度の向上が感じられた。(特に、新宿住友ビルなどのプレビュー画面において)

ピクセルフォーマットの異なるサーフェス間の転送

ピクセルフォーマット(≒ディルプレイモード≒色数)が異なるサーフェス間では
DirectDrawSurface7.Bltが正常に動作しないようだ。
(そもそも現在のディスプレイモードと異なるサーフェスが作れないのかも?)
従って、全てのサーフェスはプライマリサーフェスのピクセルフォーマット、
すなわち現在のディスプレイモードに一致させておく必要がある。
動作中にディスプレイモードを変更されると、どうしようもなくなるが、
当面そういう操作には未対応で構わないだろう。

異種フォーマットでも何か特別なパラメータの設定をすれば上手く転送できるのだろうか?
情報求む。

その他(ビデオカードの相性とか)

DirectDrawSurface7.BltFx

マニュアルを読むと、BltFxでアルファブレンドやROPを使った描画が出来そうに読める。
しかし、実はBltFxは廃れ行くAPIで、最近のビデオカードはほとんど対応していないらしい。
実際、ウチのPCでやってみても、期待通りの効果は得られなかった・・・。残念。

ちなみに、世間の潮流はDirect3D一辺倒で、半透明処理もDirect3Dで行うのが一般的らしい。
今はインストーラー配布の問題があるManaged DirectX9だが、これが使えればかなり楽になりそう。


Last-modified: 2008-05-10 (土) 00:40:02 (944d)