Управление памятью действий: когда они выпускаются? - PullRequest
1 голос
/ 01 декабря 2011

Когда вы добавляете действие к спрайту, так как большинство вещей в Cocos автоматически высвобождаются, оно освобождается после его завершения?Или, поскольку вы добавили его в узел, он сохраняется узлом?

Если действие затем заканчивается, либо из-за его самостоятельного завершения, либо из-за того, что вы остановили его самостоятельно, затем оно было освобождено или оновсе еще доступен для запуска позже?

Я спрашиваю, потому что я хочу знать, нужно ли вам воссоздать действия, чтобы использовать их повторно, или вы можете просто ссылаться на их тег и запускать и останавливать их по своему усмотрению, когда захотите.Если они повторяются, вы можете просто получить их по номеру тега, а затем запустить их снова;не ясно "правильный" способ пойти по этому поводу.Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 01 декабря 2011

Насколько я понимаю, когда вы создаете и запускаете действие для спрайта, это действие добавляется к 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];
            }
                .....
        }
    }

После проведенного исследования кажется, что тема повторного использования и действия находится на шатком основании. В любом случае, вы можете прочитать здесь, что предлагает наилучшая практика cocos2d . ИМО, я бы не стал повторять действие ...

1 голос
/ 01 декабря 2011

Действия являются однократными. Как только действие «выполнено» или остановлено или узел, выполняющий действие, освобожден, действие будет (автоматически) освобождено.

Если вам нужно повторно использовать действия, доступно только довольно страшное решение: вам нужно снова отправить соответствующее сообщение init… существующему действию. Вам также придется вручную сохранить действие.

Действия - это очень легкие классы, их производительность во время выполнения сравнима с выделением нового экземпляра NSObject. Лично я думаю, что если у вас проблемы с производительностью, потому что вы создаете и выпускаете много действий, я бы сказал, что вы слишком часто используете действия и должны искать лучшее решение.

1 голос
/ 01 декабря 2011

Когда вы передаете ссылку на CCNode с сообщением runAction, она передает его CCActionManager, который отправляет действию сообщение сохранения. Когда действие завершено, оно отправляет сообщение об освобождении. Если вы хотите продолжать использовать действие, вам следует оставить ссылку на него и отправить свои собственные сообщения об удержании и выпуске.

Действие предназначено для того, чтобы облегченные объекты «запускай и забывай». Я не стал бы беспокоиться об этом, если вы не заметите проблемы с производительностью и не отследите их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...