Длинный CGPath не рендерится

Работаю с движком spritekit и столкнулся со следующей проблемой. Мне нужно нарисовать маршрут на карте, для этого я делаю массив точек, и методом CGPathAddLines создаю путь для массива. Все работало нормально, пока я не попытался построить маршрут между двумя удаленными точками на карте. Путь этого маршрута не отображается.

Я стал разбираться с проблемой. Я получаю ограничивающую рамку моего пути с помощью CGPathGetBoundingBox и заметил, что маршрут не рисуется каждый раз, когда ширина его прямоугольника превышает 2005 пикселей. Я знаю, это звучит странно, но в моем случае это действительно так. Ниже той части кода, которая используется для создания и отображения пути:

var pathToDraw = CGPathCreateMutable()    
let pathPoints = generatePathPoints()
CGPathAddLines(pathToDraw, nil, pathPoints, pathPoints.count)      

var shapeNode = SKShapeNode()
shapeNode.path = pathToDraw
shapeNode.lineWidth = 10
shapeNode.strokeColor = UIColor.blueColor()

var effectNode = SKEffectNode()
effectNode.addChild(shapeNode)
mapNode.addChild(effectNode)

generatePathPoints - возврат функции [CGPoint]

mapNode - объект типа SKSpriteNode

Может я что-то не так делаю или это ограничение CGPath которого я не знаю?


person Alexey Pichukov    schedule 16.10.2015    source источник
comment
или это ограничение CGPath Не CGPath, а, возможно, SKShapeNode. Хорошо известно, что у него много неприятных ограничений, и вы, возможно, столкнетесь с одним из них.   -  person matt    schedule 16.10.2015
comment
Спасибо за ваш ответ, не могли бы вы рассказать какой-нибудь способ рисования пути без SKShapeNode?   -  person Alexey Pichukov    schedule 16.10.2015
comment
Вы могли бы просто нарисовать его в слое или представлении, если бы только это не было ситуацией набора спрайтов. Это делает его намного сложнее. Я полагаю, вы могли бы попробовать нарисовать его в контексте изображения и использовать полученное изображение в качестве текстуры.   -  person matt    schedule 16.10.2015
comment
Еще раз спасибо, попробую так сделать   -  person Alexey Pichukov    schedule 16.10.2015


Ответы (1)


Если он хорошо работает для коротких путей, а затем перестает работать для длинных, я предполагаю (как это сделал @matt), что это связано с ограничением SKShapeNode.

Пробовали ли вы создать более одного SKShapeNode с более короткими путями и поместить их все в другой SKNode? С помощью этого решения вы можете работать с родительским SKNode (полным SKShapeNode меньшего размера), как если бы это был ваш больший SKShapeNode, но (я надеюсь) все более короткие пути будут отображаться правильно...

person RoberRM    schedule 16.10.2015
comment
Спасибо за ваш ответ, но это не соответствует моим требованиям, мне нужен способ непрерывности, а многие SKShapeNodes плохо влияют на производительность. - person Alexey Pichukov; 16.10.2015
comment
Вы можете сделать их непрерывными, поместив один SKShapeNode в точку, где заканчивался предыдущий SKShapeNode. И плохая производительность — плохой побочный эффект этого решения, да, но, по крайней мере, это может помочь вам закончить игру, пока вы будете искать другое решение... :) Итак, я все еще верю, что это может быть хорошим (временным) решением. - person RoberRM; 16.10.2015
comment
Я уже пробовал этот вариант. И есть проблемы помимо производительности. Нет плавного перехода между строками, созданными двумя разными SKShapeNode. Выглядит это так: imagehost.spark-media.ru /i4/ Для устранения проблемы необходимо добавить в точку подключения отдельный узел. Но если это один непрерывный путь, все переходы будут плавными автоматически. И это будет выглядеть так: media.ru/i4/ - person Alexey Pichukov; 17.10.2015
comment
Что ж, тогда начните не с предыдущего пункта, а с двух предыдущих, и тогда я думаю, что они должны быть правильно связаны... В любом случае, если вы пробовали это и не нашли правильного решения, я не могу подумайте о чем-нибудь другом, кроме как ждать, пока Apple решит вашу проблему (что, я знаю, вам совсем не поможет, извините). Может у других есть другое решение? - person RoberRM; 18.10.2015