読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

Direct2Dで一昔前󠄁のFFつぽいメニュー畫面を效率良く書く

前󠄁回はメニュー畫面を每フレーム描畫してゐたが、メニュー畫面自體は每回同一なので一回レンダリングしたものをビットマップに保存してそのビットマップを描畫するやうにすると效率󠄁が良くなる。と云ふのもレンダリングするよりもビットマップをコピーする方が輕いらしい。

// コンパチレンダリングターゲット作成󠄁
Microsoft::WRL::ComPtr<ID2D1BitmapRenderTarget> tmpTarget;
ThrowIfFail(d2d1DeviceContext->CreateCompatibleRenderTarget(&tmpTarget),
            "コンパチレンダリングターゲットの作成󠄁に失敗しました。");

// コンパチレンダリングターゲットにメニューを書く  
tmpTarget->BeginDraw();
  
// 透󠄁明でクリア
tmpTarget->Clear(D2D1::ColorF(0.f, 0.f, 0.f, 0.f));
  
// メニューを書く
tmpTarget->FillRoundedRectangle(D2D1::RoundedRect(D2D1::Rect(3.f, 403.f, 797.f, 597.f), 10.f, 10.f), menuBrush.Get());
tmpTarget->DrawRoundedRectangle(D2D1::RoundedRect(D2D1::Rect(3.f, 403.f, 797.f, 597.f), 10.f, 10.f), frameBrush.Get(), 6.f);
ThrowIfFail(tmpTarget->EndDraw(), "コンパチレンダリングターゲットでの描畫に失敗しました。");

// ビットマップにレンダリング結果をコピー
Microsoft::WRL::ComPtr<ID2D1Bitmap> menuBitmap;
ThrowIfFail(tmpTarget->GetBitmap(&menuBitmap), "コンパチレンダリングターゲットのコピーに失敗しました。");

ID2D1DeviceContext::CreateCompatibleRenderTargetを使󠄁ふと現在のレンダリングターゲットとコンパチブルな新しいレンダリングターゲットが作れる。ブラシ等のリソースはID2D1DeviceContextで作つたものがそのまま使󠄁へる。
そしてこの新しいレンダリングターゲットにメニュー畫面を書く。もし透󠄁過󠄁部分󠄁がない場合はα關聯を切れば更󠄁に效率󠄁が良くなるらしい。
レンダリングが終󠄁つたらID2D1BitmapRenderTarget::GetBitmapを使󠄁つてレンダリング結果を格納󠄁したID2D1Bitmapを作る。

d2d1DeviceContext->BeginDraw();

// メニューを書いたビットマップを描畫
d2d1DeviceContext->DrawBitmap(menuBitmap.Get(), D2D1::Rect(0.f, 0.f, 800.f, 600.f));
      
ThrowIfFail(d2d1DeviceContext->EndDraw(), "ID2D1DeviceContext::EndDraw");

ID2D1DeviceContext::DrawBitmapで先程󠄁作つたメニューのID2D1Bitmapを描畫する。これを每フレーム描畫するやうにすれば確かに多少CPU使󠄁用率󠄁が落ちた。