我正在做一个小型 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/