我应该使用替代的 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
路径。
- 如果您将路径视为一个整体,即在我上面的代码示例中,那么您将路径的所有部分都称为一个...
- 如果您将路径视为单独的组件,即您创建单独的节点,那么您将处理 5 个组件(您的单独节点),即路径部分以及另一个引用它们的 SKNode ass作为一个集体......总共6个节点。
上面的 1
在内存和 cpu/gpu 使用方面效率更高。 2
以上 cpu/gpu 和内存占用更大,但它们允许您单独操作路径的每个部分。
如果上面 2
的概念是您所追求的,即分别引用路径的每个部分,那么:
- 创建一个子类SKNode,比如
SKHouseNode
- 创建几个变量来引用房子的每个部分,即
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 下降
解决此问题的一种方法是:
在更新函数的 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 次/秒)每秒帧数)...
希望这能解释更多 :) 如果没有,请向我发送聊天请求,我会尽力帮助您!
干杯:)
我有以下代码在 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
路径。
- 如果您将路径视为一个整体,即在我上面的代码示例中,那么您将路径的所有部分都称为一个...
- 如果您将路径视为单独的组件,即您创建单独的节点,那么您将处理 5 个组件(您的单独节点),即路径部分以及另一个引用它们的 SKNode ass作为一个集体......总共6个节点。
上面的 1
在内存和 cpu/gpu 使用方面效率更高。 2
以上 cpu/gpu 和内存占用更大,但它们允许您单独操作路径的每个部分。
如果上面 2
的概念是您所追求的,即分别引用路径的每个部分,那么:
- 创建一个子类SKNode,比如
SKHouseNode
- 创建几个变量来引用房子的每个部分,即
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 下降
解决此问题的一种方法是:
在更新函数的
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 次/秒)每秒帧数)...
希望这能解释更多 :) 如果没有,请向我发送聊天请求,我会尽力帮助您!
干杯:)