我有以下代码在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)
}
}
这就是我想要的,我可以用它画,但我不认为它是非常有效的。我应该使用替代方法来获得相同的绘制效果吗?或者这样可以吗?如果我应该使用别的东西,替代方法是什么?
答案 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
...想想看房子的轮廓:
在此示例中,我标记了路径的每个portion
。
上面的1
在内存和cpu / gpu使用方面更有效。上面的2
在cpu / gpu和内存上更加强大,但它们允许你单独操作路径的每个部分。
如果上面2
的概念是你所追求的,即单独指代路径的每个部分,而不是:
SKHouseNode
leftRoofPath, rightRoofPath, rightVertPath, bottomHorzPath, leftVertPath
或许作为一个结构,并将它们全部放在一起: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
这方面的一个方法是:
在更新功能的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
}
处理smooth motion
函数中的实际更新代码。所以在上面的例子中,它是每6帧而不是每帧。
虽然每毫秒的时间内绘制的数量会减少,但是人眼开始从大约25~30fps注册ALTER TABLE
...在电视上,在美国,电视模拟标准是NTSC,那是30 fps
因此,当你每秒更新你的动作时间更少时,实际的时间更新代码&#34;运行是每秒10次(在我的例子中,如果FPS是60 fps,则为10次/秒)......
希望这可以解释一下:)如果没有,请给我一个聊天请求,我会尽力帮助你!
干杯:)