2017-04-13 69 views
5

我们在我们的游戏中找到了使用SCNAction.playAudio的声明导致崩溃的原因。如果有任何playAudio语句被称为在我们的游戏中,SCNScene/SCNView的去初始化以后会随机触发此崩溃:当节点得到初始化时,SCNAction.playAudio会导致崩溃

enter image description here

我们如何播放音频:

func playAudioSource(from node: SCNNode, source audioSource: SCNAudioSource) { 
    node.runAction(SCNAction.playAudio(audioSource, waitForCompletion: false)) 
} 

它显示EXC_BAD_ACCESSCPP3DAudioEngine::RemoveContext。我们正在为iOS开发10.3使用SceneKit和斯威夫特3.

+0

尝试开启僵尸对象,这可能更容易查明被初始化的对象。 –

+0

僵尸对象,malloc日志记录都不能指出问题 – mauris

+0

嗯......我不确定那是什么问题。你提到它随机崩溃;这是播放音频后的一段时间吗? –

回答

4

你应该提供更多的代码,以更好地了解你的游戏发生什么,但肯定你可以纠正你的功能:

func playAudioSource(from node: SCNNode, source audioSource: SCNAudioSource) { 
    if let _ = node.parent, node.action(forKey: "playAudio") == nil { 
     node.runAction(SCNAction.playAudio(audioSource, waitForCompletion: false),forKey:"playAudio") 
    } 
} 

这可以防止启动当它已经启动或正在执行的动作,并检查您的节点是否已经连接到它的父母(这可能很有用,它取决于您从何处启动此代码..)

+0

不能解决。我要么在场景的根节点上播放音频,要么在场景内的特定节点上播放音频。大多数都是非定位的。似乎CPP3DAudioEngine正试图删除上下文,但它已被删除。 – mauris

+2

尝试添加更多的代码,特别是你启动这个playAudioSource的部分,你到底在哪里做,因为CPP3DAudioEngine removeContext仅在特定情况下。 –

+0

这种情况是这样的:游戏逻辑播放一个声音(运行'playAudioSource'一次)在'SCNScene'被加载后的场景的根节点上。声音小于1秒。然后大约15秒后,我离开游戏,视图控制器和所有东西都被取消了。在很短的时间之后'EXC_BAD_ACCESS'被抛出 – mauris