动作内存管理:什么时候发布?

时间:2011-12-01 16:48:49

标签: cocos2d-iphone

当你向精灵添加动作时,由于Cocos中的大部分内容都是自动释放的,它是否会在完成后释放?或者,因为您将其添加到节点,它是否由节点保留?

如果行动结束,无论是由于自己完成还是因为你自己停止,它是否会被释放,或者它是否仍然可以在以后运行?

我问,因为我想知道你是否需要重新创建动作以重复使用它们,或者你是否可以简单地引用它们的标记并随时随意启动和停止它们。如果他们重复,如果你可以简单地通过标签号获取它们然后再次运行它们;目前还不清楚“正确”的方式。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

当您使用runAction消息将引用传递给CCNode时,它将其交给CCActionManager,CCActionManager向该动作发送保留消息。一旦操作完成,它就会发送一条释放消息。如果您想继续使用某个操作,您应该保留对它的引用并发送您自己的保留和发布消息。

这些动作旨在成为轻量级的“即发即忘”对象。除非你注意到性能问题并将其追溯到它们,否则我不会担心它。

答案 1 :(得分:1)

我的理解是,当您在精灵上创建并运行操作时,操作会添加到CCActionManager,这是一个将为您管理操作的单例。这包括在释放CCACtionManager本身时以及在操作完成时释放所有这些内容。

这是关于后者的相关代码(来自CCActionManager.m):

-(void) update: (ccTime) dt
{
for(tHashElement *elt = targets; elt != NULL; ) {   
    ...
    if( ! currentTarget->paused ) {

        // The 'actions' ccArray may change while inside this loop.
        for( currentTarget->actionIndex = 0; currentTarget->actionIndex < currentTarget->actions->num; currentTarget->actionIndex++) {
                           ....

            if( currentTarget->currentActionSalvaged ) {
                              ....
                [currentTarget->currentAction release];

            } else if( [currentTarget->currentAction isDone] ) {
                                  .... 
                CCAction *a = currentTarget->currentAction;
                currentTarget->currentAction = nil;
                [self removeAction:a];
            }
                .....
        }
    }

在做了一些research之后,似乎重复使用和行动的主题是不稳定的。无论如何,你可以在这里阅读cocos2d best practices suggest。 IMO,我不会尝试重复使用动作......

答案 2 :(得分:1)

行动是一次性的。一旦操作“完成”或已经停止或者运行操作的节点被解除分配,操作将被(自动)释放。

如果您需要重复使用操作,那么只有一个相当可怕的解决方案:您需要再次将相应的init ...消息发送到现有操作。您还必须手动保留操作。

动作是非常轻量级的类,它们的运行时性能与分配新的NSObject实例相当。就个人而言,我认为如果你因为创建和发布许多动作而遇到性能问题,我会说你过多地使用动作并且应该寻找更好的解决方案。