Platform SDK: DirectX

参照カウントの増減

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。

[C++]

いくつかの DirectDraw メソッドはサーフェスの参照カウントを変更するが、サーフェスに関連付けられた他のオブジェクトに影響を与えるメソッドもある。ここでは前者を「サーフェスのみ変更」、後者を「クロスオブジェクト変更」と言う。

サーフェスのみ変更
「サーフェスのみ変更」の場合、その名の示す通り、サーフェス オブジェクトの参照カウントだけが変更される。たとえば、IDirectDraw7::EnumSurfaces メソッドを使って、特定の条件を満たす現在のサーフェスを列挙した場合、メソッドが指定されたコールバック関数を起動すると、IDirectDrawSurface7 インターフェイスへのポインタが渡されるが、アプリケーションがポインタを受け取る前に、そのオブジェクトの参照カウントがインクリメントされる。従って、オブジェクトの処理が完了したら、そのオブジェクトを解放しなければならない。通常、コールバック ルーチンの終りで解放するか、そのオブジェクトを保持する必要がある場合には後で解放する。

その他、フリッピング チェーンなどの複合サーフェスでも、サーフェスのみ変更が適用される。複合サーフェスはサーフェスの集合であるが、大部分の場合 DirectDraw では単一のオブジェクトとして扱われるので、参照カウントの扱いには注意を要する。すなわち、IDirectDrawSurface7::GetAttachedSurface および IDirectDrawSurface7::AddAttachedSurface メソッドはサーフェスの参照カウントをインクリメントし、IDirectDrawSurface7::DeleteAttachedSurface メソッドはデクリメントする。これらのメソッドによって、現在のサーフェスにアタッチされているサーフェスの参照カウントが変更されることはない。詳細については、これらのメソッドのリファレンスと、「複合サーフェスの参照カウント」を参照すること。

クロスオブジェクト変更
「クロスオブジェクト変更」は、クリッパーやパレットなど、そのサーフェスに対するタスクを実行する別のオブジェクトとサーフェスが関連付けられている場合に適用される。

IDirectDrawSurface7::SetClipperIDirectDrawSurface7::SetPalette メソッドは、アタッチされているオブジェクトの参照カウントをインクリメントする。オブジェクトがアタッチされると、サーフェスがそれらのオブジェクトを管理するが、サーフェスが解放されると、アタッチされたオブジェクトも自動的に解放される (このため、アプリケーションによっては、これらの呼び出しが成功してからオブジェクトを解放する。これは確実で有効な方法である)。

クリッパーやパレットがサーフェスにアタッチされると、IDirectDrawSurface7::GetClipperIDirectDrawSurface7::GetPalette メソッドを呼び出して、それらを再度取得することができる。これらのメソッドはインターフェイス ポインタのコピーを返すので、取得されたオブジェクトの参照カウントが暗にインクリメントされる。インターフェイスの処理が完了したら、忘れずにそのインターフェイスを解放しなければならない。オブジェクトがアタッチされたサーフェスが、そのオブジェクトに対する参照を保持している限り、インターフェイスの示すオブジェクトが解放されない。