やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GDI/GDI+/DirectX 描画アーキテクチャの切替3

GDI、GDI+、DirectXの描画を実装した。 実行中に切り替えることができる。 前回手を抜いていたインタフェース部分を変更した。

入手先

GitHub MEGA

イメージ

ソースコード一覧

ソース一覧

修正したところ

インターフェース変更

  • IDrawWndProc追加
  • IPartWndProc変更
  • 継承class変更

前回言っていたパターン3で修正した。

純粋仮想デストラクタ追加

http://www.textdrop.net/google-styleguide-ja/cppguide.xml?showone=%E7%B6%99%E6%89%BF#%E7%B6%99%E6%89%BF

クラスに仮想メソッドがあるなら、そのクラスのデストラクタは virtual にすべき

http://www.yunabe.jp/docs/cpp_virtual_destructor.html

モリーリーク系の厄介なバグの原因になる

http://www44.atwiki.jp/bokuyo/pages/131.html

virtual ~IEventListener() = 0 {}

親classにダウンキャストして使っていると、子classのデストラクタが呼ばれなくなってメモリリークする場合があるらしい。 そこで、仮想関数をもっているインタフェースclassである IPartWndProc、IDrawWndProc に純粋仮想デストラクタを追加した。

課題

描画内容だけを実装できるようなインタフェースにしたい。

現在は初期化、終了処理、再描画禁止(WM_ERASEBKGND)、ダブルバッファリング、の処理を実装している。 でもこれは、やって当たり前レベルの処理である。 固定で自動的にやってほしい。

本当にやりたいことは描画そのものである。 任意の文字列、図形、画像を描画する処理こそが、本来やりたいことである。 そこで、描画する内容だけに注力できるようなインタフェースを提供したい。

問題

描画アーキテクチャごとに渡すべき引数の型が違う。 この差異をどうやって吸収すればいいか。

アーキテクチャ ヘッダ ライブラリ
GDI HDC Windows.h デフォルト(user32.lib, kernel32.lib, ...)
GDI+ Gdiplus::Graphics gdiplus.h gdiplus.lib
DirectX9 LPDIRECT3DDEVICE9 d3d9.h d3d9.dll, dxguid.lib

所感

もっと描画をいろいろやってみたいけど、今は我慢。 インタフェース部分をおろそかにすると大規模化したときに収拾がつかなくなってしまう。 ただでさえC++のコードは見づらいので極力楽をしたい。