我有一个使用Sprite-Kit和Swift的游戏,我生成从屏幕顶部落到屏幕底部的随机圆圈。
在启动游戏时,它在开始时运行完全正常(大约60 FPS或更低)但随后FPS逐渐下降并且游戏变得非常慢......我不明白为什么FPS下降时间(节点数保持在8-10左右,所以当它们离开屏幕时它们会被移除) - 我在iOS模拟器和实际设备上测试了它,有什么想法吗?
我已经检查过,问题不是来自内存泄漏。另外,我只使用一个视图控制器。
我认为唯一能引起这个问题的功能就是这个,但我不知道为什么:
/* Function to generate single random circle */
func generateCircle() -> Void {
let circleSize:CGFloat = CGFloat(arc4random_uniform(40) + 3)
let xPosition:CGFloat = CGFloat(arc4random_uniform(UInt32(size.width)))
var randomCircle = SKShapeNode(circleOfRadius: circleSize)
randomCircle.strokeColor = SKColor.redColor()
randomCircle.fillColor = SKColor.redColor()
randomCircle.physicsBody = SKPhysicsBody(circleOfRadius: circleSize)
randomCircle.physicsBody?.dynamic = false
randomCircle.position = CGPoint(x: xPosition, y: size.height + circleSize*2)
randomCircle.physicsBody?.dynamic = true
randomCircle.physicsBody?.categoryBitMask = randomCirclesGroup
addChild(randomCircle)
}
答案 0 :(得分:2)
可能存在内存泄漏。
如果发生这种情况,我的意思是如果分配的内存继续增长,即使你知道它不应该,那么你就是在泄漏内存。
找到代码中确切问题的最佳工具是工具。
答案 1 :(得分:1)
之前我已经有了这个,节点计数让它看起来已经消失了,但它们确实没有。
您需要从视图中删除圆圈才能真正摆脱它们。
首先,你要定义一个集合(在你的类中,但不在任何函数内)
let circles = Set<SKShapeNode>()
然后在generateCircle()
函数中你会说:
circles.insert(randomCircle)
然后在update()
函数中:
override func update(currentTime: CFTimeInterval){
for index in circles {
if index.position.y <= 0 {
index.removeFromParent()
circles.remove(index)
}
}
}
基本上它的作用是,在每一帧,检查是否有任何圆圈低于屏幕底部,如果是,则删除它们。
答案 2 :(得分:0)
SKShapeNode
相比, SKSpriteNode
的效果更差,如果可能,应尽量避免使用SKShapeNode
。
Shape节点对于无法轻松分解的内容非常有用 成为简单的纹理精灵。形状节点也非常有用 在游戏之上构建和显示调试信息 内容。但是,SKSpriteNode类提供更高的性能 比这个类,所以请谨慎使用形状节点。
如果你真的想使用SKShapeNode
s (可能因为它很容易进行原型设计)我会建议你做以下事情:
[CGSize: SKTexture]
。SKSpriteNode
显示它们。将SKShapeNode
呈现为纹理you can use SKView's textureFromNode
function:
呈现节点树的内容并将渲染的图像返回为 一个SpriteKit纹理。