前へ 第03章 CopyRects命令を使って表示する 次へ

ソース 実行ファイル
dx8_2d03.cpp dx8_2d03.exe

今回はCopyRects命令を使用して高速に背景を表示してみます。

出てくる関数:
関数名 詳細
HRESULT IDirect3DDevice8::CopyRects(
IDirect3DSurface8*//転送元サーフェスのポインタ
CONST RECT*//転送する矩形のポインタ
UINT//RECT 構造体の数
IDirect3DSurface8*//転送先サーフェスのポインタ
CONST POINT*//矩形の左上角の位置
);
あるサーフェスから別のサーフェスに、
ピクセルの矩形サブセットをコピーする。
CopyRects命令はサーフェス間転送の関数です。 前回のスプライト関数はテクスチャからの表示でした。 CopyRects命令の方がより下位レベルから操作する関数であり高速です。 LPDIRECT3DSURFACE8構造体でまずサーフェスを宣言します。 d3dDevice->GetRenderTarget(&Bs); この関数では裏画面のサーフェスを得ます。 この後で色々と情報を得るために必要です。 Bs->GetDesc( &Desc ); この関数では裏画面の情報を得ます。 この情報を元に互換性のあるサーフェスを作成します。 d3dDevice->CreateImageSurface(WIDTH,HEIGHT,Desc.Format,&CopyS); この関数では裏画面と互換性のあるサーフェスを作成します。 d3dDevice->CopyRects(Bs,NULL,0,CopyS,NULL); そして裏画面を新しく作ったサーフェスにコピーします。 ちなみに先ほどから出てくる「互換性」というのは 画像フォーマット(色数・α値)が同じであるということです。 CopyRects関数は画像フォーマットの変換はしてくれません。 違っているとエラーを出して終了してしまいます。 ですから前もって裏画面と同じフォーマットにあわします。 ここまでが下準備です。 これであらかじめサーフェスに背景を保存して置けましたね。 背景の変更が無いゲーム等はこれを毎回転送してやれば高速に描画が可能です。 サーフェスから背景への転送は先ほどのコピーの逆です 指定先をそのままサーフェスから裏画面へしましょう。 d3dDevice->CopyRects(CopyS,NULL,0,Bs,NULL); 尚、今回から実用に向けてソースを変更します。 まずはfps測定機能をつけます。 これは秒間あたりの描画回数をカウントします。(fps=frame per second) これが多いほど一秒間に描画している回数が多いという事です。