2016-02-10 6 views
1

У меня есть следующий код, чтобы нарисовать картину в SKScene:Должен ли я использовать альтернативу SKShapeNode для создания чертежа? Если да, то?

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch in touches { 
     let location = touch.locationInNode(self) 
     newPoint = location 

     let pathToDraw:CGMutablePathRef = CGPathCreateMutable() 
     let myLine:SKShapeNode = SKShapeNode(path:pathToDraw) 


     CGPathMoveToPoint(pathToDraw, nil, lastPoint.x, lastPoint.y) 
     CGPathAddLineToPoint(pathToDraw, nil, newPoint.x, newPoint.y) 
     lastPoint = newPoint 

     myLine.lineWidth = 3.0 
     myLine.path = pathToDraw 
     myLine.strokeColor = SKColor.whiteColor() 

     self.addChild(myLine) 
    } 
} 

Это делает то, что я хочу, я могу рисовать с ним, но я не думаю, что это очень эффективно. Должен ли я использовать альтернативный метод, чтобы получить тот же эффект от рисования изображения, или это хорошо? Если я должен использовать что-то еще, каков будет альтернативный метод?

ответ

0

Скорее добавить «SKShapeNode» в качестве узла для рисования и есть его путь как свойство, т.е.

class MyDrawingNode: SKNode { 
    ... 
} 

и обновить путь, а не добавление отдельных детей SKNode в каждой строке, чтобы указать на пути. Так что-то эффект:

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch in touches { 
     let location = touch.locationInNode(self) 
     newPoint = location 

     let myLinePath:CGMutablePathRef = myDrawingNode.path 

     ... 
    } 

* Редактирование: * Разница здесь в том, что вы только манипулируя one объект, и это путь .. В вашем случае вы создавали many objects ... Подумайте очертание дома:

enter image description here

В этом примере я меченый каждый portion пути.

  1. Если вы думаете о пути в целом, т.е. в моем примере кода выше, то вы со ссылкой на все части пути, как один ...
  2. Если вы думаете о пути, как личности компонентов, т. е. вы создаете отдельные узлы, тогда вы имеете дело с 5 компонентами (вашими отдельными узлами), то есть части пути, а также еще один SKNode, ссылающийся на них как на коллектив ... Всего 6 узлов.

1 выше, более эффективен с точки зрения использования памяти и процессора/процессора. 2 выше - это процессор на процессор/gpu и память, но они позволяют индивидуально манипулировать каждой частью пути по отдельности.

Если понятие 2 выше является то, что вы после этого, то есть со ссылкой на каждую часть пути по отдельности, а:

  1. Создать один подкласс SKNode, скажем SKHouseNode
  2. Создание нескольких переменных, относящихся к каждая часть дома т.е. leftRoofPath, rightRoofPath, rightVertPath, bottomHorzPath, leftVertPath возможно как структура и все это вместе с:

структура HousePathComponent { вар StartPoint: CGPoint вар ENDPOINT: CGPoint вар lineThickness: CGFloat } typealias HousePath = [HousePathComponent]

var myHouse = HousePath() 

var leftVertPath = HousePathComponent(startPoint: CGPointMake(0.0,0.0), endPoint: CGPointMake(0.0,100.0), lineThickness: 1.0) 

var leftRoofNode = HousePathComponent(startPoint: CGPointMake(0.0,100.0), endPoint: CGPointMake(50.0,150.0), lineThickness: 1.0) 

var rightRoofNode = HousePathComponent(startPoint: CGPointMake(50.0,150.0), endPoint: CGPointMake(100.0,100.0), lineThickness: 1.0) 

var rightVert = HousePathComponent(startPoint: CGPointMake(100.0,100.0), endPoint: CGPointMake(100.0,0.0), lineThickness: 1.0) 

var bottomHorz = HousePathComponent(startPoint: CGPointMake(100.0,0.0), endPoint: CGPointMake(0.0,0.0), lineThickness: 1.0) 

myHouse.appendContentsOf([leftVertPath, leftRoofNode, rightRoofNode, rightVert, bottomHorz]) 

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

Есть множество способов, вы можете подойти к этому, так что я просто бросал грубые идеи там для вас играть с :)

FPS каплепадения

Один из способов об этом будет :

  1. в SKScene в функции обновления, положить некоторый код вместе, чтобы обновить только эту сцену каждые х мс, в отличие от каждого прохода что-то вроде:

    вара nthFrameCount = 0 пусть nthFrame = 6 переопределения обновления FUNC (CURRENTTIME: CFTimeInterval) {

    hero.tileSpriteIso.position = point2DToIso(hero.tileSprite2D.position) 
    nthFrameCount += 1 
    if (nthFrameCount == nthFrame) { 
        nthFrameCount = 0 
        updateOnNthFrame() 
    } 
    

    }

затем обработать фактический код обновления в updateOnNthFrame функция. Таким образом, в приведенном выше примере это будет каждый 6 кадров, в отличие от каждого кадра.

Хотя меньше будет рисовать за мс времени, человеческий глаз начинает регистрировать smooth motion примерно с 25 ~ 30 кадров в секунду ... На телевидении в США аналоговый телевизионный стандарт NTSC, и это было 30 кадров в секунду.

Так как вы обновляете свои движения меньше раз в секунду, фактическое время запуска «кода обновления» составляет 10 раз в секунду (в моем примере 10 раз/секунду, если FPS составляет 60 кадров в секунду) ...

Надеюсь, это объяснит немного больше :) Если нет, напишите мне чат-запрос, и я попробую помочь вам дальше!

Cheers :)

+0

Это работает, но эффективнее ли это? Fps все еще падает, и это также не так гладко, как я рисую больше. – MRRPlatinum

+0

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