グラフィックス(SDL + OpenGL, OpenSceneGraph)

OpenSceneGraphにおけるメモリの取り扱い

最終更新: 2015-04-20 (月) 08:44:44 (1584d)

OpenSceneGraph

スマートポインタによるメモリ管理

OpenSceneGraph は、 スマートポインタと呼ばれるメモリ管理機構を内部に持っており、 これを使用してメモリの管理を行っている。 スマートポインタとは、 ポインタが参照するオブジェクトのメモリ領域を適切に管理する能力を持ったクラスである。 任意の型のポインタに対応するために、 スマートポインタはテンプレートとして提供されるのが通常である。 スマートポインタには、いくつかの種類が存在し、その実装も様々である。 有名なスマートポインタの実装を例として挙げると、 std::auto_ptrboost::scored_ptr もしくは boost::shared_ptr などが存在する。

これらのスマートポインタは、 管理対象となるオブジェクトへのポインタと そのメモリ領域を管理方法する際に必要となる情報をもっている。 例えば、boost::shared_ptr は、メモリ領域の管理情報として参照カウンタという値を持っている。 このカウンタは、最初 1 で初期化される。 スマートポインタは、ポインタの値がコピーされるたびにカウントをインクリメントし、 ポインタが使われなくなったときにカウンタをデクリメントする。 結果的に参照カウンタは、管理対象となるオブジェクトが参照されている数を示すことになる。 参照カウンタが 0 の値になったときが、オブジェクトが全く参照されなくなったときであり、 boost::shared_ptr は、それを検出して メモリ領域を開放する。 このようなスマートポインタを、参照カウンタ式スマートポインタという。

osg::ref_ptr テンプレートと osg::Referenced クラス

OpenSceneGraph は、独自の参照カウンタ式スマートポインタを持っている。 このスマートポインタは、 osg::ref_ptr テンプレートと osg::Referenced クラスの二つの要素によって実装されている。 osg::ref_ptr テンプレートは、osg::Referenced の派生クラスのポインタに対応したスマートポインタである。 osg::ref_ptr テンプレートと、osg::Referenced クラスの役割分担を以下に示す。

  • osg::Referenced クラス
    • 参照カウンタを保持する。
  • osg::ref_ptr テンプレート
    • osg::Referenced クラスのポインタを保持する。
    • osg::Referenced クラスが持つ参照カウンタのインクリメントおよびデクリメントを制御する。
    • 参照カウンタを監視し、メモリ領域の破棄を実行する。

このスマートポインタの特徴は、 osg::Referenced の派生クラスのみに対応しているという点である。 以下に OpenSceneGraph のリファレンスを示す。

リファレンスを見ると、osg::Node クラスやその派生クラスが osg::Referenced の派生クラスであることがわかる。 OpenSceneGraph では、このスマートポインタの機能を利用してシーングラフのメモリを管理している。