swift - SKScene 在空闲时变得无响应

标签 swift sprite-kit scenekit skaction skscene

你好,我有一个 SceneKit 游戏。所有游戏都在一个场景中进行,当游戏结束时, Sprite 工具包叠加层充当游戏结束屏幕,当他们再次点击播放时, Sprite 工具包标签消失,游戏在同一场景中全部重置。

我的发行即将在游戏结束时到来。如果用户在几秒钟内点击重播按钮,那么一切都会顺利进行。但是,如果用户坐在游戏结束位置上超过五秒钟,那么场景就会卡住。我真的很困惑,因为应用程序在卡住时处于空闲状态并且我没有收到任何错误。与玩游戏相比,游戏期间内存和 CPU 使用率也低得多。此外,该应用程序本身并没有被卡住,就像我单击菜单按钮一样,它会很好地过渡到新的 View Controller 。

没有内存泄漏或错误,我真的不知道从哪里开始寻找问题所在?有人能指出我正确的方向吗

更深入地了解正在发生的事情: 该游戏是一款使用物理模拟的半分钟短 Action 游戏。有一个计时器设置为每 0.01 秒触发一次,这会影响游戏的进行。当游戏结束时(由一个节点与另一个节点碰撞引起)玩家节点被移除,一个变量被设置为 false 这样当游戏计时器触发时什么也不会发生,并且在 sprit kit overlay 中创建了一堆标签节点作为游戏结束菜单。

同样,如果用户在五秒内点击重播,一切都会很好。单击重播隐藏所有标签,在起始位置创建玩家节点,并将计时器变量设置回真。

这里是设置场景的代码

// create a new scene
scene = SCNScene()
sceneView = SCNView()
sceneView.frame = self.view.frame
sceneView.autoresizingMask = UIViewAutoresizing.allZeros
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = false
sceneView.allowsCameraControl = false
sceneView.showsStatistics = false
sceneView.backgroundColor = UIColor.blackColor()
scene.physicsWorld.gravity = SCNVector3Make(0, -30, 0)
scene.physicsWorld.contactDelegate = self
self.view = sceneView
self.MarbleGeo = SCNSphere(radius: 1.3)
hud = Hud(size: self.view.frame.size, game: self)
sceneView.overlaySKScene = hud

编辑

我已经找到了代码崩溃的地方。单击再次按钮时,所有标签都应该移动或淡出或沿着这些线产生一些效果。无论如何,重新启动游戏的方法调用是在这些效果中的最后一个完成时进行的。这是代码

println("Before check")
MenuLabel.runAction(moveButtonsOut, completion: { () -> Void in
    self.scoreLabel.removeFromParent()
    self.MyGame.Setup()
    self.MyGame.Restart(true, Level: self.MyGame.level)
    self.startTimer()
    println("should have called the game to begin by now")
    //self.playing = true
    //self.MyGame.addMarble()
})

记录了第一个语句,但没有记录完成 block 内部的语句。所以我想我的问题现在变成了为什么这些操作在游戏卡住后没有运行和完成?

编辑

似乎 SKActions 被踢出了队列。在 game over 场景中,一些标签一遍又一遍地放大和缩小,有些标签淡入淡出等等。无论如何,当所有这些都在进行时,重播按钮效果很好,没有错误。当所有这些操作卡住时,即按钮不再起作用,因为重启方法在完成时永远不会被调用。我尝试将重启方法放在完成之外,当它们被称为所有操作时,因为解冻并且它们都急于完成并且看起来很糟糕。所以总结一下就是暂停 SKActions

希望这对您有所帮助。

最佳答案

您的 SceneKit 场景正在播放吗? 当您拥有

  • scene.playing = YES
  • SCNAction 实例运行
  • 运行隐式或显式动画

SpriteKit 场景覆盖仅在 SceneKit 场景刷新时刷新。因此,如果 SceneKit 场景没有重新显示,覆盖层中设置的 Action 可能不会运行。

一个解决方案可能是设置 playing 属性或将 Action 添加到 SceneKit 对象而不是 SpriteKit 对象。

这无关紧要,但请尽量远离计时器。 SceneKit 提供了几个游戏循环回调,让您可以做您想做的事。

关于swift - SKScene 在空闲时变得无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28141782/

相关文章:

ios - 带有进度指示器或事件微调器的 Swift 3 核心数据迁移

ios - 在导航堆栈中以模态方式呈现 View Controller

ios - 如何进行 CGPath 或 SKShapeNode 旋转

swift - 如何在更改 SpriteKit 中的变量之前创建延迟

ios - 从 scenekit 中的网络服务器加载 collada 文件

ios - 在 3d 空间中对 UIGestureRecogniser 进行 HitTest

swift - 如何在 swift 中使用 SCNMaterial 创建 NEON Material ?

swift - 链接到 TextView 并可以编辑 TextView (Swift 4)

ios - Swift Sprite 工具包事件指示器

ios - 场景中的 ARKit 3D 头部跟踪