SceneKit - 音频会在我第一次播放声音时导致cxa_throw延迟

时间:2015-07-29 12:15:44

标签: ios xcode swift audio scenekit

我播放这样的声音(这是在SCNNode子类中):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_article, menu);

    /* Search results in new activity, clicked article passed back to articleActivity
       Associate searchable configuration with the SearchView */
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

    ComponentName componentName = new ComponentName(this, SearchResultsActivity.class);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));

    return true;
}

第一次调用它时,我会遇到严重的延迟,并且会被抛出。 当我禁用All_Expection_Breakpoint时,我注意到滞后。

我可以对此做些什么?

enter image description here

2 个答案:

答案 0 :(得分:1)

C ++异常来自SceneKit音频层使用的AVAudioEngine。 AVAudio *框架在内部使用C ++异常,因此如果在Xcode中设置了断点,以便在抛出C ++异常时中断,Xcode将在AVAudio *代码中破坏很多(主要是在初始化时)。您可以放心地忽略这些,因为它们在到达您的代码之前就被框架捕获了。

如果您不想要延迟,可以在启动时实例化音频源并加载它:      让audioSource = SCNAudioSource(命名:" coin.wav")      audioSource.load()

然后在以后需要时添加播放器:     让audioPlayer = SCNAudioPlayer(来源:audioSource)     self.addAudioPlayer(audioPlayer)

顺便说一句,玩家会被缓存和回收,所以你不必过多担心内存被无用。

另请注意,SCNAction使用与您完全相同的API,因此如果您使用.load()创建一个之前未加载到内存中的声音的动作,您也会遇到延迟。 / p>

希望这有帮助,

S上。

答案 1 :(得分:0)

这实际上仅适用于大气,环境和背景环境中的各种声音,可以通过角色循环和移动,也可以附加到瀑布的位置或类似的位置。

它不是一个高性能的即时声音播放器,可立即实现低延迟的声音效果。

为此,您最好在需要时使用SCNAction将音频作为动作播放,或者使用专为低延迟声音播放而设计的Fmod。

我不知道我怎么知道这件事。