出于性能方面的考虑,我的目标是使所有这些波动画相同。这将有助于减少计算波浪路径的成本,并减少绘制次数。
我在SpriteKit设置中有一个场景,如下所示:
→有指向动画版本here的链接。
场景主要由两部分组成:
波浪是这样创造的:
// 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块石头,这增加了性能成本。有没有办法使这些波浪动画在所有这些石头下重复出现?
我能想到的可能选择:
将路径转换为纹理,可以在多块石头之间共享该纹理吗?但是,我认为将每帧两次(对于每个波形)两次转换为纹理,然后将其复制到...上会很慢。
渲染传入和传出的波的完整动画遍,然后将其循环到每个节点。但是如何?
还有哪些其他解决方案可能更好?
我不不想创建图集并为其设置动画。我无法执行此操作,因为这些石头和波浪的大小会有所变化,具体取决于屏幕的大小和级别,并且我希望它们具有像素级的效果。但是,我不介意(如第二点所述)存储动画循环的纹理,然后重复进行。