Microsoft DirectX 8.0 (C++) |
オブジェクトをキャッシングすると、IDirectMusicLoader8::GetObject メソッドは常にオブジェクトの同じインスタンスを返すようになる。
キャッシュには、オブジェクトへのポインタが格納される。オブジェクト自体のメモリは COM によって管理され、参照カウントが 0 になるまで解放されない。キャッシュからオブジェクトを解放することと、オブジェクトに対するアプリケーションの COM 参照を解放することは異なることに注意が必要である。
ファイル ロード プロセスでは、オブジェクトへのリンクを解決するためにキャッシングが広範囲に使われる。たとえば、2 つのセグメントが同じスタイルを参照している場合を考える。最初のセグメントをロードするときに、セグメントはローダーを呼び出してスタイルを取得する。ローダーは、スタイル オブジェクトを作成してディスクからデータをロードし、スタイル オブジェクトへのポインタをキャッシュに格納して、このポインタをセグメントに返す。キャッシングが有効な場合、2 番目のセグメントがロードされるときにスタイルの問い合わせが行われ、ローダーが直ちに同じポインタを返す。2 つのセグメントは、どちらも同じスタイルを指している。キャッシングが無効な場合は、2 番目のセグメントが同じスタイルを要求したときに、同じスタイル オブジェクトがファイルからロードされて重複するので、時間とメモリを消費する。
別の例を考えてみる。バンド オブジェクトが、ローダーに General MIDI の DLS コレクションをキャッシュに置くよう要求する場合を考える。バンドが GM 音色をダウンロードする必要があるたびに、ローダーからコレクションを取得する。CLSID_DirectMusicCollection のキャッシングが無効になっている場合、MIDI ファイル内でパッチ チェンジが発生するたびに、GM コレクション全体のコピーが作成される。これは明らかに好ましくない。
デフォルトでは、すべてのオブジェクト クラスでキャッシングが有効になっている。IDirectMusicLoader8::EnableCache メソッドを使うと、1 つまたはすべてのオブジェクト クラスのキャッシングを無効にできる。このメソッドを使って、任意またはすべてのオブジェクト クラスのキャッシングを有効にすることもできる。
今後のキャッシングを無効にせずにキャッシュを消去するには、IDirectMusicLoader8::ClearCache メソッドを使う。キャッシュはローダーが解放されると自動的に消去されるので、アプリケーションを終了する前にこのメソッドを呼び出す必要はない。ClearCache が必要になるのは、まったく新しい音色やサウンド ファイルを使って、アプリケーションのサウンドトラックを完全に変更する場合だけである。
一般的なキャッシングが無効であるときに、1 つのオブジェクトをキャッシュするには、そのオブジェクトを IDirectMusicLoader8::CacheObject メソッドに渡す。
IDirectMusicLoader8::ReleaseObject または IDirectMusicLoader8::ReleaseObjectByUnknown メソッドを使ってキャッシュからオブジェクトを削除し、次にそのオブジェクトに対して GetObject を呼び出したときに、そのオブジェクトが再びロードされることを保証できる。オブジェクト、特にセグメントについて Release を呼び出す前にこれらのメソッドのいずれかを呼び出すのは良い考えである。この呼び出しを行わなかった場合、オブジェクトへの参照がキャッシュ内に残り、オブジェクトは存在し続ける。メモリを消費すると共に、オブジェクトは特定の状態情報を保持する場合がある。セグメントの場合は、今後ロードするインスタンスがキャッシュからロードされ、開始ポイントとループ ポイントが、前のインスタンスが破棄されたときの状態と同じになる。
キャッシュ管理の詳細については、「ガベージ コレクション」を参照すること。