Как избежать падения FPS при рисовании линий в SpriteKit?

В моем текущем проекте есть симулятор гравитации, в котором спрайты движутся в соответствии с силами, с которыми они сталкиваются в игровой сцене.

Одна из моих функций заключается в том, что я позволяю движущимся спрайтам рисовать линию позади себя, чтобы вы могли видеть, какими путями они идут.

Здесь показано:

введите описание изображения здесь

Однако по мере того, как Sprite продолжает движение по экрану, FPS начинает падать. Это можно увидеть на втором изображении, где прошло некоторое время с тех пор, как спрайт впервые начал свое движение.

введите описание изображения здесь

При исследовании я обнаружил, что другие люди писали с похожими проблемами:

Несколько skshapenode в одном розыгрыше?

Однако в приведенном выше вопросе плакат с ответом подробно описал, что он (ответ) предназначался для статического изображения, чего я не хочу, потому что эта строка будет меняться в реальном времени в зависимости от того, что влияет на путь спрайтов, это отразилось, когда я попытался реализовать функцию для добавления новой строки к старой, которая не сработала. Этот код здесь

Я спрашиваю, может ли кто-нибудь помочь мне найти способ правильно остановить это постоянное падение FPS, которое происходит из-за всех операций рисования. Мой текущий код отрисовки состоит из двух функций.

-(void)updateDrawPath:(CGPoint)a B:(CGPoint)b
{
    CGPathAddLineToPoint(_lineToDraw, NULL, b.x, b.y);
    _lineNode.path = _lineToDraw;
}

-(void)traceObject:(SKPlanetNode *)p
{
    _lineToDraw = CGPathCreateMutable();
    CGPathMoveToPoint((_lineToDraw), NULL, p.position.x, p.position.y);
    _lineNode = [SKShapeNode node];
    _lineNode.path = _lineToDraw;
    _lineNode.strokeColor = [SKColor whiteColor];
    _lineNode.antialiased = YES;
    _lineNode.lineWidth = 3;
    [self addChild:_lineNode];
}
  • updateDrawPath: Рисует линию до последней позиции спрайта.

  • traceObject: Берет SKPlanetNode (подкласс SKSpriteNode) и настраивает его так, чтобы после него рисовалась линия.

Если бы кто-нибудь мог предложить способ сделать это, а также уменьшить ужасные накладные расходы, которые я продолжаю накапливать, это было бы фантастически!


person Micrified    schedule 16.01.2015    source источник
comment
рисование спрайтов должно быть n ^ 2, если они связаны друг с другом ... попробуйте нарисовать свою линию как кривую Безье или растровое изображение и составить ее ...   -  person Grady Player    schedule 16.01.2015
comment
Я нашел решение, отвечая на этот вопрос: stackoverflow.com/questions/24553245/ - это было связано с рисованием касанием, но решение напрямую применимо к вашей текущей проблеме.   -  person prototypical    schedule 16.01.2015
comment
@prototypical Это ваше решение! Также . Если вы установите ShowDrawCount в своем экземпляре SKView, вы поймете, что я имею в виду. У меня нет слишком большого количества отрисовок, но проблема все еще видна   -  person Micrified    schedule 16.01.2015
comment
вот что я сказал, я нашел решение, отвечая на этот вопрос.   -  person prototypical    schedule 16.01.2015
comment
Вам нужно принять к сведению элемент кеширования моего ответа. SKShapeNode НЕ эффективен, когда у вас есть все эти сегменты, и становится еще хуже, когда вы продолжаете рисовать.   -  person prototypical    schedule 16.01.2015
comment
@prototypical Мое плохое, следует ли мне использовать движущиеся спрайты в качестве холста (номер 3 в вашем списке)?   -  person Micrified    schedule 16.01.2015
comment
Холст - это то, на чем вы рисуете. Каждый раз, когда ваш спрайт перемещается, проводите линию от его старого положения к новому. Время от времени вы кэшируете, сглаживая и повторно используя те узлы формы, которыми вы рисуете.   -  person prototypical    schedule 16.01.2015
comment
@prototypical Извините за ошибку, но я пытался реализовать ваше решение, и у меня проблемы с методом cacheSegments (отмечены в файле) pastebin.com/uJK1pRBS   -  person Micrified    schedule 16.01.2015
comment
Я должен знать, в чем проблема. Как я сказал в ответе, это не всеобъемлющий код, а пример основных концепций. не работает довольно расплывчато :) сообщение об ошибке?   -  person prototypical    schedule 16.01.2015
comment
@prototypical Обнаружил проблему, не инициализировал то, что мне было нужно. Однако видимых линий пока нет.   -  person Micrified    schedule 16.01.2015
comment
@prototypical Спасибо за помощь! Линии не остаются на экране, но завтра я попробую еще раз.   -  person Micrified    schedule 16.01.2015
comment
В отличие от сайтов форумов, мы не используем "Спасибо", "Любая полезная помощь" или подписи на Stack Overflow. См. Если «Привет», «спасибо» слоганы и приветствия убирать из сообщений?. Кстати, спасибо заранее, а не заранее.   -  person John Saunders    schedule 16.01.2015


Ответы (1)


Пара предложений:

  • Учтите, что SKShapeNode - это более или менее просто инструмент для отладки рисования в основном из-за того, что он не рисует партиями, поэтому действительно не подходит для создания игры вокруг этого или для его широкого использования (как многие формы, так и несколько но сложной формы).
  • Вы можете рисовать линии, используя собственный шейдер, что, вероятно, будет более быстрым и элегантным решением, хотя, конечно, вам, возможно, сначала придется научиться писать программы шейдера.
  • Обязательно измеряйте производительность только на устройстве, а не на симуляторе.
person LearnCocos2D    schedule 16.01.2015
comment
Пользовательские шейдеры не поддерживаются в iOS7, с которой я работаю. У меня не будет выбора, кроме как отказаться от Spritekit или найти альтернативу SKShapeNode. . , если кто-то не может предложить обходной путь. Вздох . . - person Micrified; 17.01.2015
comment
Если вы только начали, вы определенно получите больше свободы рисовать свои собственные вещи с помощью SpriteBuilder + Cocos2D-Swift. Я думаю, что у CCRenderer даже есть встроенный метод рисования линий. - person LearnCocos2D; 17.01.2015