【问题标题】:and again about memory issues with SoundPool再次关于 SoundPool 的内存问题
【发布时间】:2010-11-04 15:16:35
【问题描述】:

我知道 SoundPool 旨在处理类似效果的小型声音,并且我确保要按某个顺序一个一个播放的 4 个声音剪辑足够小。

我使用了 ogg 质量 0,剪辑为 35kb、14kb、21kb 和 23kb,总共 92kb 的压缩音频。我不知道如何估计未压缩的大小,但应该不会很多吧?

因此,当我按顺序播放 4 个声音时,前 9 次效果很好(9 个序列 x 4 个声音),但开始导致其中一个声音的 9 序列出现记忆问题。当我开始看到错误时,它总是序列 9。

处理这个问题的最佳方法是什么?我有几个想法:

1) 进一步压缩声音(ogg 质量 -1 和单声道而不是立体声)

2) 使用 SoundPool.load 和 SoundPool.unload 不断卸载和加载声音

3) 不时释放并重新创建 soundPool 实例

还有什么我可以做的吗?尴尬的是android api 不能处理这么小的剪辑。我想知道人们是如何制作带有大量音效的游戏的……

错误看起来像这样:

错误/AudioFlinger(35):AudioTrack size=1048640 内存不足 DEBUG/MemoryDe​​aler(35): AudioTrack (0x25018,size=1048576)

【问题讨论】:

    标签: android soundpool


    【解决方案1】:

    似乎我能够在以下情况下解决我的问题:

    1) 将我的声音片段从 44 下采样到 22khz。未压缩的大小被减半(我想出了如何估计未压缩的声音大小 - 将您的剪辑导出为未压缩的 wav)。我使用了不错的开源工具 Audacity

    2) 进一步修剪声音以减少持续时间

    3) 将 try/catch 放在 play() 周围以防万一(它会在尝试播放声音但不能捕获错误时捕获错误)

    【讨论】:

    • 谢谢它对我有用。在此之前,我的声音文件被剪切了。但是我已经将 m4a 从 44 转换并重新采样到 22,现在它可以正常工作而不会被削减。
    【解决方案2】:

    这似乎很奇怪。 SoundPool 应该在加载音频剪辑时将它们扩展到内存中,并且一旦加载,我不希望您以后会遇到内存问题。当我遇到内存问题时,它是在一开始,而不是后来。您确定以后不会加载更多声音吗?

    为了回答您的其他问题,有些游戏使用 JET Player 和 MIDI 声音而不是 SoundPool。 Android SDK 中的 JetBoy 示例程序是一个很好的示例,说明了如何在应用程序中进行此类声音工作。

    【讨论】:

    • 感谢您的回复...我今天对我的应用程序进行了更多测试,发现问题发生在我使用 soundpool 循环循环的 4 种声音上。我加载了 17 个其他剪辑,它们工作正常,但在我的应用程序触发 4 个循环剪辑之一后,它崩溃了。我确实在创建活动时预先加载了所有这些,而在其他任何地方都没有。我将我的剪辑从 44 下采样到 22khz,这有点帮助,但应用程序仍然因内存问题而崩溃。
    • 我需要播放 ogg 文件,所以我猜 JetBoy 不适合我,但感谢您的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2011-10-08
    • 2016-03-14
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多