我在Android上遇到OpenSL ES问题。我正在使用OpenSL播放声音效果。目前我每次播放声音时都会创建一个新的播放器。 (我知道这不是非常有效,但它暂时“足够好”。)
播放一段时间后,我开始收到这些错误:
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;
}
答案 0 :(得分:2)
if (playerState == SL_OBJECT_STATE_REALIZED)
不需要。尽量做到这一点。
AbortAsyncOperation
在Destroy =>
中被调用,不需要。(*pPlayerObject)->Destroy(pPlayerObject);
就足够了。 修改强>
我测试了,找到了解决方案。
您无法从播放器Destroy()
拨打callback
。应该制作" destroy
"列出并在其他地方销毁它,例如,在主线程中。