c++ - 我应该使用 CCArray 在 cocos2d-x 中保存自定义 CCNode 吗?

标签 c++ cocos2d-x

最近遇到一个问题。我在 cocos2d-x 中大量使用了 vector STL。在我的一节课上,我写道:

vector<StrokeDrawnode*> strokedrawList;

StrokeDrawnode 继承自CCNode。然而,我读到一些文章说最好使用 CCArray 来保存 CCObject 的子类。实际上,我对内存管理有疑问。我想这是问题所在。所以我的问题是我应该在什么情况下使用 CCArray 以及如何处理内存管理。

什么情况下应该这样定义类成员?

CC_SYNTHESIZE_RETAIN(CCSprite* , m_sprite_draw, Sprite);

最佳答案

在这种情况下,std::vectorCCArray 之间的主要区别在于,当您将对象添加到 CCArray 时,它们会被保留。这在 cocos 中非常重要,因为 CCObject-dervied(基本上所有)对象在它们的 retainCount 达到 0 时被销毁。这是在每一帧之间自动完成的。

考虑这个例子:假设您想要创建 5 个 sprite 并将它们缓存起来供以后使用(它们要等到将来某个时间才会出现在屏幕上)。代码(在 init() 方法的某处):

for(int i = 0; i < 5; ++i) {

   CCSprite *vectorSprite = (...);
   CCSprite *arraySprite = (...);

   _vector.push_back(vectorSprite);
   _array->addObject(arraySprite);

}

_array->retain(); // < ------- IMPORTANT!

// end of init method 

我们当然假设 _vector_array 是实例变量,并且不会在 init() 结束时被销毁。

在绘制下一帧之前发生的是我们放入 _vector 中的所有 Sprite 都将被销毁 - 该 vector 将保存指向无效内存位置的指针。

我们放入 _array 的对象不会,因为 addObject 为我们保留了它们。请注意,_array 本身也必须保留,否则它将被销毁(我不确定它的内容)。

一般来说,我认为在处理 cocos 对象时使用 cocos-containers 可能会更好,因为您只需要记住保留容器本身,而不是所有对象。如果你真的想使用 std::vector 子类化 std::vector 可能是合理的,这样它的 push_backpop_back 方法将分别保留realese 您的对象。


至于宏——我从未使用过它,但它扩展为:

#define CC_SYNTHESIZE_RETAIN(varType, varName, funName)    \
private: varType varName; \
public: virtual varType get##funName(void) const { return varName; } \
public: virtual void set##funName(varType var)   \
{ \
    if (varName != var) \
    { \
        CC_SAFE_RETAIN(var); \
        CC_SAFE_RELEASE(varName); \
        varName = var; \
    } \
} 

它为您的变量创建一个 setter 和 getter 以供外部使用。在我看来,只有当您想将变量公开给外部使用并自动为您提供此方法时,它才可行。这里的附加值当然是setter中完成的retain-release过程。

如果有什么不清楚的,请告诉我! 干杯。

关于c++ - 我应该使用 CCArray 在 cocos2d-x 中保存自定义 CCNode 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22681078/

相关文章:

c++ - 在多个头文件中拆分类是否可以?

android - cocos2d-x CCDirector,暂停/恢复 vs stopAnimation/startAnimation

c++ - Web 应用程序和 C++

c++ - 使用 std::deque 时重定位赋值

Android NDK - 命名空间 'function' 中没有名为 'std' 的类型

ios - iPad 上的 MFMailComposeViewController 黑屏

ios - cocos2d-x如何使用CCFadeOUT

c++ - 如何在cocos2d(cocos2d-x)中制作流水效果

c++ - CPU 松弛指令和 C++11 原语

C++:合并排序合并数组