CGPath проблема?

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

Я думаю, что это CGPath, который вызывает у меня проблемы, кажется, он не очищается? Всякий раз, когда я генерирую новый путь из алгоритма, игрок всегда возвращается к той позиции, в которой он впервые начал, затем он будет перемещаться по расстоянию каждого пути, созданного до сих пор в приложении. Это происходит каждый раз, когда я пытаюсь создать новый путь.

Есть идеи?

-(void)doubleTap:(UITapGestureRecognizer *)touchPoint
{
    CGPoint touchLocation = [touchPoint locationInView:touchPoint.view];
    touchLocation = [self convertPointFromView:touchLocation];

    //on double tap take the location of the player and the location tapped and pass it to the path finder.
    CGPoint start = CGPointMake((int)(player.position.x/SPACING), (int)(player.position.y/SPACING));
    CGPoint end = CGPointMake((int)(touchLocation.x/SPACING), (int)(touchLocation.y/SPACING));
    NSMutableArray *points = [NSMutableArray arrayWithArray:[self reverseArray:[pathFinder findPath:start End:end]]];

    //convert path to moveable path for sprite, move sprite along this path.
    CGMutablePathRef path = CGPathCreateMutable();

    if (points.count > 0)
    {
        PathFindingNode *firstNode = [points objectAtIndex:0];
        CGPathMoveToPoint(path, NULL, firstNode.position.x, firstNode.position.y);

        for (int i = 1; i < points.count; i++)
        {
            firstNode = [points objectAtIndex:i];
            CGPathAddLineToPoint(path, NULL, firstNode.position.x, firstNode.position.y);
        }
    }

    SKAction *hover = [SKAction followPath:path asOffset:NO orientToPath:YES duration:2.0];
    [player runAction: [SKAction repeatAction:hover count:1]];
    [points removeAllObjects];
    CGPathRelease(path);
}

При передаче пути к этому коду где-то происходит утечка памяти:

 //convert path to moveable path for sprite, move sprite along this path.
    CGMutablePathRef path = CGPathCreateMutable();

    if (points.count > 0)
    {
        PathFindingNode *firstNode = [points objectAtIndex:0];
        CGPathMoveToPoint(path, NULL, firstNode.position.x, firstNode.position.y);

        for (int i = 1; i < points.count; i++)
        {
            firstNode = [points objectAtIndex:i];
            CGPathAddLineToPoint(path, NULL, firstNode.position.x, firstNode.position.y);
        }
    }

    SKAction *hover = [SKAction followPath:path asOffset:NO orientToPath:YES duration:2.0];
    [player runAction: [SKAction repeatAction:hover count:1]];
    [points removeAllObjects];
    CGPathRelease(path);
}

Если я закомментирую этот код, то на iPad память останется около 50 Мб. Если он не закомментирован, он просто продолжает подниматься все выше и выше до тех пор, пока не выйдет около 1.5 ГБ.

1 ответ

Решение

Код, который вы разместили, создаст новый путь и заполнит его точками в вашем массиве точек. Либо ваш массив точек всегда содержит предыдущие точки плюс ваши новые точки, либо метод комплекта сцены followPath:asOffset:orientToPath:duration: добавляет новый путь к старому. (На самом деле я еще не использовал комплект сцены, поэтому я не знаю об этой последней возможности.)

В любом случае ваш код обработки CGPath выглядит хорошо. Вы вспомнили CGRelease CGPath, который не делают многие люди, которые знают только ARC.

Другие вопросы по тегам