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.