如何在 cocos2d-x 中轻松清除自定义共享实例

How to easily purge custom shared instances in cocos2d-x?

本文关键字:清除 自定义 共享 实例 cocos2d-x      更新时间:2023-10-16

我正在做一个小型的 Cocos2d-x 项目,在那里我受到 CCDirector::sharedDirector() 方法和 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()?谢谢!

好吧,也许你不应该首先受到单例模式的"启发"。

是的,

它们可以说很容易上手,也很诱人,但在99%的情况下(包括大多数cocos2d的单例)它们也是糟糕的设计。特别是因为你说"几个"。

单例本质上是全局变量的容器。全局变量(如单例变量)最好避免使用,除非它们与所有其他类完全分离并且服务于单一目的。NSFileManager就是一个很好的例子,或者SimpleAudioEngine单例。

更好的设计使用依赖对象和包含对象的树状结构,这与场景中节点的层次结构没有什么不同。在无单例设计中,"清除"对象变得微不足道。一旦清除了处理特定任务(即场景)的最父对象,那么所有后代对象都会随之自动清除 - 前提是代码中没有任何对象生存期(内存管理)错误。

每个类都应该负责创建和释放它包含的对象。通过"包含",我的意思是作为成员变量的实例指针,或者有时是包含实例指针的数组或字典成员变量。

本文很好地解释了对象生命周期C++重点。但这只是一个开始。

经过一个严肃的"Douh!"时刻,我意识到清除自定义单例最容易放在AppDelegate::~AppDelegate()析构函数中,其中 cocos2d-x Xcode 模板中提供了AppDelegate。所以我做到了。