2017-04-13 74 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