Platform SDK: DirectX

複合サーフェスの参照カウント

[Visual Basic]

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

[C++]

フリッピング チェーンなどの複合サーフェスの操作に使用するメソッドはすべて、サーフェス インターフェイス ポインタを使うので、サーフェスの参照カウントに影響を与える。複合サーフェスは、実際には単一サーフェスの集合なので、参照カウントの処理にはいくつかの注意が必要である。まず、IDirectDrawSurface7::GetAttachedSurface メソッドは、現在のサーフェスにアタッチされたサーフェスへのサーフェス インターフェイスを返す。取得されるインターフェイスの参照カウントをインクリメントしてからインターフェイスを返すので、不要になった場合にはそのインターフェイスを解放する必要がある。IDirectDrawSurface7::AddAttachedSurface メソッドは、新しいサーフェスを現在のサーフェスにアタッチする。また、AddAttachedSurface メソッドは、アタッチされたサーフェスのカウントをインクリメントする。チェーンからサーフェスを削除して、暗にその参照カウントをデクリメントするには、IDirectDrawSurface7::DeleteAttachedSurface メソッドを使用する。

これらのメソッドで注意しなければならないのは、複合サーフェスを構成する他のオブジェクトの参照カウントは変更されないことである。GetAttachedSurface メソッドは、取得するサーフェスの参照カウントをインクリメントするだけで、そのサーフェスがアタッチされたサーフェスのカウントには影響しない (IUnknown::AddRef メソッドを暗に呼び出す場合も同様である)。したがって、複合サーフェスでは、従属サーフェスの参照カウントがゼロになる前に、プライマリ サーフェスの参照カウントがゼロになる。プライマリ サーフェスの参照カウントがゼロになると、そのサーフェスにアタッチされた他のサーフェスは、参照カウントの現在の値に関係なく解放される (木の幹を切ると木全体が倒れるのと似ている。この場合、プライマリ サーフェスが幹である)。プライマリ サーフェスの割り当てが削除された後で従属サーフェスにアクセスしようとすると、メモリに障害が発生する。

このような問題が発生するのを防ぐため、プライマリ サーフェスを解放する前に、すべての従属サーフェスを解放する必要がある。アプリケーションが保持している参照を追跡し、プライマリ サーフェスへの参照が保持されていることを確認してから、従属サーフェスにアクセスする方法が確実である。