我应该使用替代的SKShapeNode来创建绘图吗?如果是这样的话?

时间:2016-02-10 03:39:53

标签: swift skscene skshapenode

我有以下代码在SKScene中绘制图片:

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)
    }
}

这就是我想要的,我可以用它画,但我不认为它是非常有效的。我应该使用替代方法来获得相同的绘制效果吗?或者这样可以吗?如果我应该使用别的东西,替代方法是什么?

1 个答案:

答案 0 :(得分:0)

而是添加&#34; SKShapeNode&#34;作为你的绘图节点,并将其作为一个属性的路径,即

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个节点。
  3. 上面的1在内存和cpu / gpu使用方面更有效。上面的2在cpu / gpu和内存上更加强大,但它们允许你单独操作路径的每个部分。

    如果上面2的概念是你所追求的,即单独指代路径的每个部分,而不是:

    1. 创建一个子类SKNode,比如SKHouseNode
    2. 创建几个引用房子每个部分的变量,即leftRoofPath, rightRoofPath, rightVertPath, bottomHorzPath, leftVertPath或许作为一个结构,并将它们全部放在一起:
    3. struct HousePathComponent {         var startPoint:CGPoint         var endPoint:CGPoint         var 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的内容绘制路径,SKScene是各种结构的数组。

      有很多方法可以解决这个问题,所以我只是在那里投掷粗略的想法让你玩具:)

      FPS Dropping

      这方面的一个方法是:

      1. 在更新功能的hero.tileSpriteIso.position = point2DToIso(hero.tileSprite2D.position) nthFrameCount += 1 if (nthFrameCount == nthFrame) { nthFrameCount = 0 updateOnNthFrame() } 中,将一些代码放在一起,每次只用 x ms更新场景,而不是像每次传递一样:

        var nthFrameCount = 0 让nthFrame = 6 override func update(currentTime:CFTimeInterval){

        updateOnNthFrame

        }

      2. 然后

        处理smooth motion函数中的实际更新代码。所以在上面的例子中,它是每6帧而不是每帧。

        虽然每毫秒的时间内绘制的数量会减少,但是人眼开始从大约25~30fps注册ALTER TABLE ...在电视上,在美国,电视模拟标准是NTSC,那是30 fps

        因此,当你每秒更新你的动作时间更少时,实际的时间更新代码&#34;运行是每秒10次(在我的例子中,如果FPS是60 fps,则为10次/秒)......

        希望这可以解释一下:)如果没有,请给我一个聊天请求,我会尽力帮助你!

        干杯:)