如何针对效果同时重复多次动画?

时间:2019-10-06 19:57:59

标签: ios swift sprite-kit cabasicanimation sktexture

出于性能方面的考虑,我的目标是使所有这些波动画相同。这将有助于减少计算波浪路径的成本,并减少绘制次数。

我在SpriteKit设置中有一个场景,如下所示:

Scene →有指向动画版本here的链接。

场景主要由两部分组成:

  • 石头(浅灰色和深灰色六边形)
  • 波浪(每块石头有2个-较浅和较深的蓝色动画路径)

波浪是这样创造的:

// Wave outline shape node
shapeNode               = SKShapeNode(path: self.oldPath)
shapeNode.strokeColor   = wave.color
shapeNode.lineWidth     = 5
shapeNode.zPosition     = waveIndex == 0 ? Layer.farWave : Layer.nearWave
shapeNode.lineJoin      = .round
shapeNode.position      = stoneCell.node.position.offset(by: stoneCell.offsetVector)
view.scene?.addChild(shapeNode)

// Layer which creates the animation
shapeLayer = CAShapeLayer()
shapeLayer.isHidden = true
view.layer.addSublayer(shapeLayer)

animate()

还有animate()函数:

/// Animates the wave's path. This method calls itself forever.
private func animate() {
    let newPath = WavePath(wave: wave, direction: currentDirection).createPath()

    let anim = CABasicAnimation(keyPath: "path")
    anim.duration   = 2  // Duration of the wave movements in a direction (in or out)
    anim.fromValue  = oldPath
    anim.toValue    = newPath
    anim.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)

    shapeLayer.path = newPath
    shapeLayer.add(anim, forKey: nil)

    shapeNode.run(SKAction.customAction(withDuration: anim.duration, actionBlock: { (node, timeDuration) in
        (node as? SKShapeNode)?.path = self.shapeLayer.presentation()?.path
    }), completion: {
        self.oldPath = newPath
        self.currentDirection.toggle()
        self.animate()
    })
}

出现问题是因为现场有10块石头,这增加了性能成本。有没有办法使这些波浪动画在所有这些石头下重复出现?

我能想到的可能选择:

  • 将路径转换为纹理,可以在多块石头之间共享该纹理吗?但是,我认为将每帧两次(对于每个波形)两次转换为纹理,然后将其复制到...上会很慢。

  • 渲染传入和传出的波的完整动画遍,然后将其循环到每个节点。但是如何?

还有哪些其他解决方案可能更好?

不想创建图集并为其设置动画。我无法执行此操作,因为这些石头和波浪的大小会有所变化,具体取决于屏幕的大小和级别,并且我希望它们具有像素级的效果。但是,我不介意(如第二点所述)存储动画循环的纹理,然后重复进行。

0 个答案:

没有答案