2013-09-05 25 views
0

我正在做一個小型的Cocos2d-x項目,其中我受到了在Cocos2d-x中由CCDirector::sharedDirector()方法和其他共享實例實現的「單例」模式的啓發。例如,在CCDirector.cpp我們有如何輕鬆清除cocos2d-x中的自定義共享實例?

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()被調用或類似時,是否可以撥打回叫電話?謝謝!

回答

0

經過嚴重的「Douh!」那時候,我意識到,清除自定義單身人士將很容易被放置在AppDelegate::~AppDelegate()析構函數中,其中AppDelegate在cocos2d-x Xcode模板中提供。所以我做了。

1

好的,也許你不應該首先受到Singleton模式的「啓發」。

是的,他們可以很容易地拿起並且很誘人,但是在99%的案例中(包括大多數cocos2d的單身人士),它們也是糟糕的設計。特別是因爲你說過「其中幾個」。

單例實質上是一個全局變量的容器。全局變量(像單身人士)是最好的避免除非他們完全脫離所有其他類和服務一個單一的目的。 NSFileManager就是一個很好的例子,或者SimpleAudioEngine單例。

更好的設計使用依賴和包含對象的樹狀結構,而不像場景中節點的層次結構。在單獨設計中,清除對象變得微不足道。一旦清除了處理特定任務(即場景)的父級對象,則所有後代對象都會自動清除 - 前提是代碼中沒有任何對象生命週期(內存管理)錯誤。

每個類都應該負責創建和釋放它所包含的對象。 「包含」我的意思是實例指針作爲成員變量或有時包含實例指針的數組或字典成員變量。

這篇文章很好地解釋了C++ object life cycles。但這只是一個開始。

+0

感謝您的輸入!我完全同意Singleton模式的缺陷。考慮到我的需要,我正在考慮去參加一個單身遊戲:一個'GameLobby',它將完成所有與服務器端的交談。這是可取的,因爲玩家可能同時進行多個遊戲,因此中央實例可以建立活動遊戲列表以及將遊戲數據推送到「遊戲」類。我會再考慮一遍。 – conciliator

相關問題