【问题标题】:CPU usage to 100% when subclassing node actions子类化节点操作时 CPU 使用率达到 100%
【发布时间】:2017-01-22 22:46:04
【问题描述】:

我正在设计一个游戏,我希望最多 20 个节点(子类为 LocationNodes)同时在屏幕上旋转。但是,当我调用以下函数时,我的 CPU 使用率达到 100%,应用程序崩溃。这是 spinLocations() 函数,它在存储在 locationPositions 数组中的节点上调用 spin:

func spinLocations() {
    for (key, val) in locationPositions {
        let locationNode = fgNode.atPoint(val) as? LocationNode
        let finalLocation = generateRandomLocation()
        locationNode?.spin(locationNode!, position: generateRandomLocation(), finalPosition: finalLocation)
        locationPositions[key] = finalLocation
    }
}

在子类LocationNode中,spin函数如下所示:

func spin(_ locationNode: LocationNode, position: CGPoint, finalPosition: CGPoint) {
    self.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.move(to: position, duration: 3.0), SKAction.move(to: finalPosition, duration: 3.0)]))
}

我怎样才能重写它以免崩溃?

【问题讨论】:

  • 您多久调用一次 spin?在我看来,您只是不断添加和添加并最终耗尽内存
  • @amalfilemons spin() 方法中不需要 locationNode 参数。你不使用它。本例中的位置节点与self相同。
  • @Knight0fDragon 这是最接近的答案。我跑过跟踪,并不是纹理占用了内存,而是动作本身触发了另一个函数,导致无限循环占用了内存。

标签: swift sprite-kit


【解决方案1】:

spin 函数似乎是正确的,但我总是更喜欢仅在其自身尚未运行时才执行它,这样您就可以避免由于未提供执行未执行操作或节点位移而感到陌生:

func spin(_ locationNode: LocationNode, position: CGPoint, finalPosition: CGPoint) {
        if self.action(forKey: "spin") == nil {
            self.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.move(to: position, duration: 3.0), SKAction.move(to: finalPosition, duration: 3.0)]), withKey:"spin")
        }
}

条件转换运算符as? 尝试执行转换,但如果不能,则返回nil。因此其结果是可选的。 您可以使用 for-in 循环遍历字典中的键值对,但在检查您使用 atPoint 检索的 节点类型 类型之后:

for (key, val) in locationPositions {
        let locationNode = self.atPoint(val as! CGPoint)
        if locationNode is LocationNode {
            let finalLocation = generateRandomLocation()
            locationNode.spin(locationNode!, position: generateRandomLocation(), finalPosition: finalLocation)
            locationPositions[key] = finalLocation
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多