Как быстро происходит распределение и освобождение в Цели C? - PullRequest
1 голос
/ 05 июля 2011

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

Взять этот метод, например:

-(void) checkCGPointDistances{

    CCSprite *tempSp;

    CCLabelTTF *tempLabel;

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

        tempSp = [hummingBirds objectAtIndex:i];

        checkDistance = [[CheckDistance alloc] init];

        if([checkDistance checkDistanceWithLimit:tempSp.position withPoint2:hero.heroSprite.position withLimit:150] == YES){

            if(hero.heroSprite.position.x > tempSp.position.x){
                tempSp.flipX = YES;
            }else{
                tempSp.flipX = NO;
            }

            tempLabel = [hummingLabels.labelsArr objectAtIndex:i];


            [tempLabel setString:@"Hello!"];

            [hummingLabels.deactivateLabelToggle replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:1]];
        }

        [checkDistance release];

    }

    if(abilityRushH == 0){
        checkDistance = [[CheckDistance alloc] init];

        if([checkDistance checkDistanceWithLimit:rushH.rushHSprite.position withPoint2:hero.heroSprite.position withLimit:32] == YES){
            [rushH.rushHSprite removeFromParentAndCleanup:NO];

            abilityRushH = 1;
            NSLog(@"horizontal rush activated");
        }

        [checkDistance release];
    }

    if(abilityRushV == 0){
        checkDistance = [[CheckDistance alloc] init];

        if([checkDistance checkDistanceWithLimit:rushV.rushVSprite.position withPoint2:hero.heroSprite.position withLimit:32] == YES){
            [rushV.rushVSprite removeFromParentAndCleanup:NO];

            abilityRushV = 1;
            NSLog(@"vertical rush activated");
        }

        [checkDistance release];
    }
}

Обратите внимание, как я распределяю и освобождаю checkDistance для каждого цикла в цикле for? Этот метод также вызывается по таймеру очень быстро. Причина, по которой я решил делать выделение снова и снова внутри стихов цикла, заключается в том, что число hummingBirdsMax может быть равно 0, поэтому ему вообще не нужно было бы выделять. Я полагаю, я мог бы просто проверить, если hummingBirdsMax> 0, но то, как я это делаю, имеет большое значение?

Класс, который он выделяет, просто проверяет расстояние между CGPoints и возвращает bool.

1 Ответ

3 голосов
/ 05 июля 2011

Нет ничего плохого в том, что вы делаете.Невозможно определить, являются ли выделение и освобождение объектов узкими местами производительности в вашем коде без какой-либо работы с профилировщиком (Shark или Instruments).Как и во всех решениях по оптимизации производительности, нет никаких оснований даже спекулировать без каких-либо данных.

Тем не менее, если все, что делает класс CheckDistance, выполняет вычисления, это на самом деле не объект (т. Е. Инкапсулирующий состояние иразоблачает поведение).Почему бы просто не реализовать вычисление как функцию C?В отличие от управляемого Java / C # мира, к которому сейчас привыкли многие, не все должно быть (и не должно быть) классом.

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