1. MAPILの構成

-節の内容-

MAPILではウィンドウだけでなく、グラフィックスのリソースなども全て同じ手続きで取得します。
リソースの取得がどのように行われているかについて簡単に紹介します。
内部の詳細に興味のない方は、2節のウィンドウの表示から始めていただいて構いません。


-MAPILの構成-

MAPILは7つのモジュールから構成されます。

1. Applicationモジュール
Applicationモジュールは、ウィンドウの作成やイベントハンドラなど、アプリケーションを開発する上で必要な機能を提供します。
Applicationモジュールは内部でWin32APIやGTKのAPIを呼んでいます。
Win32APIを実際に使ったことのある方はご存知であると思いますが、Win32APIはウィンドウを表示させるだけでもソースコードが100行を超えてしまういう、曲者なAPIです。
このような煩雑な手続きを行うのがApplicationモジュールの仕事です。
なおこのモジュールを使用することによりWin32APIを使ってもGTKを使っても、ソースコードに影響を与えなくすることができます。

2. Graphicsモジュール
Graphicsモジュールは3Dモデルや2D画像の表示など、文字通りグラフィックスに関するインターフェースを提供します。
Graphicsモジュールは内部でDirectXやOpenGLのAPIを呼んでいます。
これらAPIを呼ぶための煩雑な手続きや、リソース管理を使用者は意識する必要がありません。
また3DグラフィックスAPIとして、DirectXを使うかOpenGL使うかによってソースコードを変更する必要はありません。

3. IOモジュール
IOモジュールは、ファイルを除いた入出力を取り扱うことができます。
キーボードやマウスからのイベントを取得することが出来ます。
内部ではWin32APIを呼んでいますが、Direct Inputなどをサポートしていく予定です。
しかし変更による、ソースコードの改変は行わなくても問題ありません。

4. Soundモジュール
Soundモジュールは、音楽ファイルを再生する時に役立ちます。
なお、ストリーミング再生にも対応しており、サイズの大きな音楽でもメモリを節約して再生することができます。
Soundモジュールは内部でOpenALのAPIを呼んでおり、煩雑な手続きをせずに音楽の再生を行うことができます。

5. Threadモジュール
Threadモジュールはマルチスレッディングを行うためのクラスを用意しています。
ThreadモジュールはWindowsではWin32API、LinuxではPOSIXを使用します。

6. Fileモジュール
FileモジュールはBMPやWAVなどのファイルを取り扱うことのできるクラス群です。

7. Mathモジュール
Mathモジュールは行列やベクトルなど、数学を取り扱うことの出来るテンプレートクラス群です。


-リソース取得の流れ-

MAPILでリソースを取得する場合、以下に沿った手順が必要となります。
この手順は、Applicationモジュール・Graphicsモジュール・IOモジュール・Soundモジュールでリソースを取得する時に使用します。

1. Factoryオブジェクトを作成する
Factoryオブジェクトは、それぞれのモジュールに所属するリソース管理を担うオブジェクトです。
使用者は使用するAPIを決めて、Factoryオブジェクトを作成しなくてはなりません。
作成されたFactoryオブジェクトは、プログラムの終了前に削除しなくてはなりません。
削除し忘れるとメモリリークを引き起こします。

2. FactoryオブジェクトからCreate〜メソッドを呼び出す
Factoryオブジェクトの作成が終わったら、Create〜から始まるメソッドを呼び出す必要があります。
このメソッドを呼び出すことで、各リソースのインターフェースオブジェクトが返されます。
引数として文字列を渡すことで、各リソースに名前を付けることができます。
この文字列を使ってFactoryオブジェクトで管理されているリソースを検索する事ができます。
Factoryオブジェクトを破棄することで、Factoryオブジェクトで管理されているリソースを全て削除することができるので、各リソースの解放を忘れても、メモリリークを防ぐことが出来ます。

3. 各リソースのインターフェースでCreateメソッドを呼ぶ
最後に各リソースのインターフェースを使用する前にCreateメソッドを呼ぶことで、リソースを作成する事ができます。
これにより初めてリソースの実体が作成され、リソースを使用することができるようになります。
なお各リソースは、インターフェースオブジェクトとしてアクセスされるので、オブジェクトのコピーは参照のコピーとなることに注意してください。

inserted by FC2 system