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

Should I use an alternate of SKShapeNode to create a drawing? If so what?

我有以下代码在 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)
    }
}

这就是我想要的,我可以用它画画,但我认为它不是很有效率。我应该使用替代方法来获得与绘制图片相同的效果还是这样可以?如果我应该使用其他方法,替代方法是什么?

而是添加一个 "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...想想房屋轮廓:

在这个例子中,我标记了每个 portion 路径。

  1. 如果您将路径视为一个整体,即在我上面的代码示例中,那么您将路径的所有部分都称为一个...
  2. 如果您将路径视为单独的组件,即您创建单独的节点,那么您将处理 5 个组件(您的单独节点),即路径部分以及另一个引用它们的 SKNode ass作为一个集体......总共6个节点。

上面的 1 在内存和 cpu/gpu 使用方面效率更高。 2 以上 cpu/gpu 和内存占用更大,但它们允许您单独操作路径的每个部分。

如果上面 2 的概念是您所追求的,即分别引用路径的每个部分,那么:

  1. 创建一个子类SKNode,比如SKHouseNode
  2. 创建几个变量来引用房子的每个部分,即 leftRoofPath, rightRoofPath, rightVertPath, bottomHorzPath, leftVertPath 也许作为一个结构并将它们放在一起:

构造房屋路径组件{ 变种起点:CGPoint 变量端点: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 的内容绘制路径,它是各种结构的数组。

有很多方法可以解决这个问题,所以我只是抛出粗略的想法供您玩弄:)

FPS 下降

解决此问题的一种方法是:

  1. 在更新函数的 SKScene 中,将一些代码放在一起以仅每 x 毫秒更新一次场景,而不是每次通过类似于:

    var nthFrameCount = 0 让 nthFrame = 6 覆盖函数更新(当前时间:CFTimeInterval){

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

    }

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

虽然每毫秒绘制的时间更少,但人眼开始记录 smooth motion 从大约 25~30fps...在电视上,在美国,电视模拟标准是 NTSC,那是30 帧/秒。

因此,随着您每秒更新动作的次数减少,"update code" 的实际时间 运行 为每秒 10 次(在我的示例中,如果 FPS 为 60,则为 10 次/秒)每秒帧数)...

希望这能解释更多 :) 如果没有,请向我发送聊天请求,我会尽力帮助您!

干杯:)