我在Android上遇到了OpenSL ES的問題。我使用OpenSL播放聲音效果。目前,我每次播放聲音時都會創建一個新播放器。 (我知道這是不是非常有效的,但它是「足夠好」暫且。)OpenSL ES Android:「對象太多」SL_RESULT_MEMORY_FAILURE
一段時間回放後,我開始得到這些錯誤:
E/libOpenSLES(25131): Too many objects
W/libOpenSLES(25131): Leaving Engine::CreateAudioPlayer (SL_RESULT_MEMORY_FAILURE)
我跟蹤我的創建/銷燬模式,在任何時候我都不會超過4個優秀的對象,遠低於32的系統限制。當然,這是假設Destroy正常工作。
我現在唯一的猜測是,當我清理播放器對象時,我正在做一些不正確的事情。一個可能的問題是Destroy通常在播放器回調的環境中被調用(基本上在播放完成後摧毀播放器),儘管我找不到任何參考提示這是一個問題。除了「摧毀」玩家對象之外,還有其他的清理步驟嗎?需要以某種方式清理接口嗎?
- 新增 -
更多的測試後,將創建30後球員一貫發生(有發動機和搭配也讓使總數達到32個對象)。所以我不應該正確地銷燬對象。下面的代碼 - 我倒是很想知道發生了什麼事情不對:是不是需要
SLuint32 playerState = 0;
SLresult result = (*pPlayerObject)->GetState(pPlayerObject, &playerState);
return_if_fail(result);
if (playerState == SL_OBJECT_STATE_REALIZED)
{
(*pPlayerObject)->AbortAsyncOperation(pPlayerObject);
(*pPlayerObject)->Destroy(pPlayerObject);
}
else
{
__android_log_print(1, LOG_TAG, "Player object in unexpected state (%d)", playerState);
return 1002;
}