ゲーム開発のためのオブジェクト指向(Singleton)

投稿者: | 2012年5月27日

シングルトンクラス

シングルトンクラスとは、そのアプリケーション内で、そのインスタンスが「唯一」であることを保障するものです。

これをゲームに適用する場面としては、

  • サウンドカード、グラフィクスカードなどのデバイスクラス
  • 唯一のファクトリクラス

などとなります。

要はゲーム起動時から終了時まで、ずっと存在するインスタンスですね。

注意点

個人で作ったPCゲームであれば問題ないのですが、仕事でゲームを作る場合「メモリ管理」という問題が出てきます。

例えば以下のようなコードはゲームの開発現場ではNGと思っています。

class Singleton {
private:
    static Singleton* m_pThis = NULL;
public:
    // インスタンスを取得する
    static Singleton* GetInstance() {
        if(m_pThis == NULL) {
            // 作っていなかったら作る
            m_pThis = new Singleton();
        }
        
        // インスタンスを返す
        return m_pThis;
    }
}

これはSingleton::GetInstance()が呼ばれたタイミングでインスタンスを生成する、というパターンです。

この実装はコード量が少なくなり楽なのですが、

  1. いつ生成されるか分からないから、実行順によりメモリの配置情報が変わってしまう
  2. Singletonクラスでメモリリークしている疑いがあっても、このクラスの機能を無効にできない
    1. Singleton::GetInstance()を使う側でNULLチェックをしていればいいが、たいていそのような実装はされない
      1. たいていSingleton::GetInstance()->Hogehoge();という使い方をされる(NULLチェックしない)

これを解消するためには面倒でも

static Singleton* s_pThis = NULL;
void Singleton_Init() {
    if(s_pThis) { return; } // 生成済み
    s_pThis = new Singleton();
}
void Singleton_Hogehoge() {
    if(s_pThis == NULL) { return; } // 生成されていないので何もしない
    s_pThis->Hogehoge();
}

という作りにしておくことで後々起こる問題を回避することができます。

GetInstanceでインスタンスの生成をする、ポインタを直接見る、これはよろしくないということです。