0

CCDirector::sharedDirector()Cocos2d-xのメソッドと他の共有インスタンスによって実装される「シングルトン」パターンに触発された小さな Cocos2d-x プロジェクトを行っています。たとえばCCDirector.cpp

static CCDisplayLinkDirector *s_SharedDirector = NULL;

// ...

CCDirector* CCDirector::sharedDirector(void)
{
    if (!s_SharedDirector)
    {
        s_SharedDirector = new CCDisplayLinkDirector();
        s_SharedDirector->init();
    }

    return s_SharedDirector;
}

void CCDirector::purgeDirector()
{
    // cleanup scheduler
    getScheduler()->unscheduleAll();

    // ...

    // delete CCDirector
    release();
}

このpurgeDirector()メソッドは、共有アニメーション キャッシュ、共有スプライト フレーム キャッシュなど、他のすべての共有インスタンスを削除します。すべて同じモールドにキャストされます。共有ゲーム ロビーのように、いくつか自分でやりたいと思っています。

CCDirector は間違いなく変更される可能性があるため、変更したくありません。

パージ コードを配置できる自然な場所はありますか? が呼び出されたときにコールバックを鳴らす可能性はありますcocos2d::CCDirector::sharedDirector()->end()か? ありがとう!

4

2 に答える 2

1

そもそも、Singleton パターンに「触発」されるべきではないかもしれません。

はい、間違いなく簡単に手に入れることができ、魅力的ですが、すべてのケース (cocos2d のシングルトンのほとんどを含む) の 99% で悪い設計でもあります。特にあなたが「これらのカップル」と言ったので。

シングルトンは基本的にグローバル変数のコンテナです。グローバル変数 (シングルトンなど) は、他のすべてのクラスから完全に切り離され、単一の目的を果たす場合を除き、避けるのが最善です。NSFileManager が良い例で、SimpleAudioEngine シングルトンです。

より優れた設計では、シーン内のノードの階層とは異なり、依存オブジェクトと包含オブジェクトのツリーのような構造を使用します。シングルトンのない設計では、オブジェクトを「パージ」するのは簡単になります。特定のタスク (シーンなど) を処理する最上位のオブジェクトを削除すると、コードにオブジェクトの有効期間 (メモリ管理) のバグがない限り、すべての子孫オブジェクトが自動的に削除されます。

各クラスは、含まれるオブジェクトの作成と解放を担当する必要があります。「含む」とは、メンバー変数としてのインスタンス ポインター、または場合によってはインスタンス ポインターを含む配列または辞書メンバー変数を意味します。

この記事では、 C++ オブジェクトのライフ サイクルについて適切かつ的確に説明しています。しかし、それは始まりにすぎません。

于 2013-09-05T19:15:02.130 に答える