【问题标题】:SKScene becomes unresponsive while being IdleSKScene 在空闲时变得无响应
【发布时间】:2015-01-25 21:32:32
【问题描述】:

您好,我有一个 SceneKit 游戏。所有的游戏都在一个场景中进行,当游戏结束时,精灵套件覆盖作为游戏结束屏幕,当他们再次点击播放时,精灵套件标签消失并且游戏在同一场景中全部重置。

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

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

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

如果用户在五秒内点击回放,一切都会很好。点击replay会隐藏所有标签,在起始位置创建players节点,并将timers变量设置回true。

这是设置场景的代码

// 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()
})

第一个语句被记录,但完成块内部的那个不是。所以我想我的问题现在变成了为什么一旦游戏冻结,这些动作就不会运行和完成?

编辑

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

希望这会有所帮助。

【问题讨论】:

  • 只有在您发布至少可能导致问题的代码时,我们才能提供帮助。您还应该记录并使用断点来查看实际情况。
  • 我已经尝试注释掉每一个可能是原因的代码
  • 查看编辑以获取有关@LearnCocos2D 问题的更多见解
  • 你有在 GameOver 场景中使用的计时器吗?您是否尝试过 NSLog 以查看 5 秒后调用了哪些方法(如果有)?将是自我排除故障的良好开端。
  • @Scott 在游戏结束的场景中没有发生任何事情。该应用程序实际上是空闲的。唯一发生的变化是标签在反复增长和缩小,但我已经尝试对此发表评论。该应用程序什么都不做,只是在等待用户决定是否再次播放

标签: swift sprite-kit scenekit skaction skscene


【解决方案1】:

您的 SceneKit 场景正在播放吗? 当你有一个场景正在播放时

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

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

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

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

【讨论】:

  • 当它冻结播放时是错误的,要修复我应该让场景工具包动作重复?
  • 三种方式中的任何一种都可以。我发现设置playing 属性比重复运行一个空动作更优雅。
  • 我同意我喜欢只使用属性方式,但是当游戏结束时将 play 设置为 true 不会毫无意义,因为直到五到十秒后播放才会变为 false?
  • 我不明白你的问题。这个 5-10 秒的间隔是为了什么?你为什么要在这么长的时间之后改变财产?
  • 我用 SCNAction 替换了我的游戏计时器,并用一块石头杀死了两只鸟。我按照建议摆脱了计时器,现在该动作使场景不会暂停
猜你喜欢
  • 2010-10-20
  • 2020-06-08
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
相关资源
最近更新 更多