Objective c 节点离开屏幕后松开fps

Objective c 节点离开屏幕后松开fps,objective-c,sprite-kit,skspritenode,skphysicsbody,Objective C,Sprite Kit,Skspritenode,Skphysicsbody,我目前正在用精灵工具包做一个简单的游戏。在游戏中,你是一个四处移动的正方形,可以向敌人射击。您拍摄的投射物只是从SKSpriteNode继承的自定义类。游戏开始时效果很好,但随着你继续射击,FPS速度会慢慢下降到极低。但是,当射弹离开屏幕时,节点计数会回到发射射弹之前的原始值 我试图解决的第一件事是,当射弹击中边缘时,以某种方式将其从场景中释放出来。下面是我尝试这样做的代码,但它根本不起作用 -(void)didBeginContact:(SKPhysicsContact *)contact {

我目前正在用精灵工具包做一个简单的游戏。在游戏中,你是一个四处移动的正方形,可以向敌人射击。您拍摄的投射物只是从SKSpriteNode继承的自定义类。游戏开始时效果很好,但随着你继续射击,FPS速度会慢慢下降到极低。但是,当射弹离开屏幕时,节点计数会回到发射射弹之前的原始值

我试图解决的第一件事是,当射弹击中边缘时,以某种方式将其从场景中释放出来。下面是我尝试这样做的代码,但它根本不起作用

-(void)didBeginContact:(SKPhysicsContact *)contact {
if (contact.bodyA.categoryBitMask == projectileCategory) {
    if (contact.bodyB.categoryBitMask == edgeCategory) {
        [contact.bodyA.node removeFromParent];
    }
} else if (contact.bodyA.categoryBitMask == edgeCategory) {
    if (contact.bodyB.categoryBitMask == projectileCategory) {
        [contact.bodyB.node removeFromParent];
    }
}

}

为了提高性能,您可以在更新功能中删除屏幕外的投射物

override func update(currentTime: CFTimeInterval) {
    for node in self.children as [SKNode] {
        if node.name == "projectile" {
            if !CGRectContainsPoint(self.frame, node.position)
            {
                println("removed")
                node.removeFromParent()
            }
        }
    }
}

你在设备上测试过吗?是的,所有这些都是在设备上完成的。游戏一开始运行得很好,但随着你继续拍摄,FPS速度会慢慢下降到极低。听起来好像每次创建一个新的投射物时,您的代码都会保留一些东西,并在投射物离开屏幕时继续这样做。检查所有与投射物相关的代码。您可以删除更新功能中穿过边缘的所有投射物屏幕上不可见的节点不会自动删除,它们将不再在调试fps显示屏上显示,但它们仍然存在并参与物理模拟为我工作,谢谢!