Platform SDK: DirectX

オブジェクトのキャッシング

[Visual Basic]

ここでは、C++ で記述されたアプリケーションに関連のある内容だけを説明する。

[C++]

オブジェクトをキャッシングすると、IDirectMusicLoader::GetObject メソッドは常に同じインターフェイスポインタを返すようになる。

ファイル ロード プロセスでは、オブジェクトへのリンクを解決するためにキャッシングが広範囲に使われる。キャッシュ内にオブジェクトが見つからない場合、そのオブジェクトが既に存在している場合でも、オブジェクトを再ロードしなければならない。たとえば、2 つのセグメントが同じスタイルを参照している場合を考える。最初のセグメントをロードするときに、セグメントはローダーを呼び出してスタイルを取得する。続いてスタイルは、スタイル オブジェクトを作成してディスクからロードし、スタイルへのポインタをキャッシュに格納して、これをセグメントに返す。キャッシングが有効な場合、2 番目のセグメントがロードされるときにスタイルの問い合わせが行われ、ローダーが直ちにこれを返す。2 つのセグメントは、どちらも同じスタイルを指している。キャッシングが無効な場合は、2 番目のセグメントが同じスタイルを要求したときに、同じスタイルがファイルからロードされて重複することになる。これは非常に効率が悪い。

もう一つの例として、IDirectMusicBand が General MIDI の DLS コレクションをキャッシュに置くよう要求する場合を考える。IDirectMusicBand が GM 音色を操作するたびに、ローダーに GUID_DefaultGMCollection を要求し、ローダーからコレクションを取得する。CLSID_DirectMusicCollection のキャッシングが無効になっている場合、MIDI ファイル内でパッチ チェンジが発生するたびに、GM コレクション全体のコピーが作成される。

デフォルトでは、すべてのオブジェクト クラスでキャッシングが有効になっている。IDirectMusicLoader::EnableCache メソッドを使うと、1 つまたはすべてのオブジェクト クラスのキャッシングを無効にできる。このメソッドを使って、任意またはすべてのオブジェクト クラスのキャッシングを有効にすることもできる。

今後のキャッシングを無効にせずにキャッシュを消去するには、IDirectMusicLoader::ClearCache メソッドを使う。

1 つのオブジェクトをキャッシングするには、そのオブジェクトを IDirectMusicLoader::CacheObject メソッドに渡す。IDirectMusicLoader::ReleaseObject メソッドを使ってキャッシュからオブジェクトを削除し、次にそのオブジェクトに対して GetObject を呼び出したときに、そのオブジェクトが再びロードされることを保証できる。

Release メソッドを呼び出してオブジェクトを破棄する前に、キャッシングされたオブジェクト、特にセグメントに対して ReleaseObject を呼び出す。呼び出しを行わなかった場合、オブジェクトのコピーがキャッシュ内に残り、特定の状態を表す情報が保持される。セグメントの場合は、今後作成するインスタンスがキャッシュからロードされ、開始ポイントとループ ポイントが、前のインスタンスが破棄されたときの状態と同じになる。

CacheObjectReleaseObject、および EnableCache を適切に使うことにより、不必要なオブジェクトをキャッシュから削除し、その他のオブジェクトをキャッシュに残すことができる。