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

标签 c++ cocos2d-x purge

我正在做一个小型 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() 方法清除所有其他共享实例,如共享动画缓存、共享 Sprite 帧缓存等 - 所有这些都是在同一个模型中类型转换的。我想自己做一些,比如共享游戏大厅。

我宁愿不修改 CCDirector,因为它肯定会发生变化。

有什么自然的地方可以放置我的清除代码吗?当 cocos2d::CCDirector::sharedDirector()->end() 被调用或类似时,是否有可能响起回调?谢谢!

最佳答案

好吧,也许您一开始就不应该受到单例模式的“启发”。

是的,它们可以说很容易上手并且很诱人,但在 99% 的情况下(包括大多数 cocos2d 的单例)它们也是糟糕的设计。特别是因为你说了“其中一些”。

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

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

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

本文解释C++ object life cycles切中要点。但这只是一个开始。

关于c++ - 如何在 cocos2d-x 中轻松清除自定义共享实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642649/

相关文章:

android - 清空 "Classes"文件夹cocos2dx 3.0 eclipse

caching - Nginx 反向代理缓存失效策略

maven - mvn 依赖项 :purge-local-repository fails in multi-module project

svn - 颠覆会保存已删除的文件吗?

python - 重新解释 Julia 中的指针

c++ - 序列化,没有库的整数,得到奇怪的结果

ios - CCBlade 不适用于 cocos2d-x 3.8 版本

c++ - cocos2dx 当我将 setPhysicsBody 设置为 sprite 时,sprite 消失了

c++ - 从传递给模板函数的内部类实例中提取外部类类型

c++ - 相乘时输出错误。这是我的编译器中的错误吗? C++