当你向精灵添加动作时,由于Cocos中的大部分内容都是自动释放的,它是否会在完成后释放?或者,因为您将其添加到节点,它是否由节点保留?
如果行动结束,无论是由于自己完成还是因为你自己停止,它是否会被释放,或者它是否仍然可以在以后运行?
我问,因为我想知道你是否需要重新创建动作以重复使用它们,或者你是否可以简单地引用它们的标记并随时随意启动和停止它们。如果他们重复,如果你可以简单地通过标签号获取它们然后再次运行它们;目前还不清楚“正确”的方式。谢谢你的帮助。
答案 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实例相当。就个人而言,我认为如果你因为创建和发布许多动作而遇到性能问题,我会说你过多地使用动作并且应该寻找更好的解决方案。