我目前正在开发一个使用 SoundJS 的应用程序。我发现代码库在iPad上无法正常工作后继承了代码库 - 问题在于它创建了大约16个MP3文件的清单,总共大约35.7mb。这显然导致iPad问题,并且在16mb时它崩溃了。
根据诊断和使用情况日志,崩溃日志显示它是由于每个进程限制。
我已经深入研究了SoundJS的底层结构,并且可以看到它的默认行为是通过XHR利用WebAudio。然后将其解析为ArrayBuffer(或ArrayBuffers数组)。
目前这意味着,在预加载后,我们在ArrayBuffers中有35.7mb的数据 - 不好。在处理文件大小后 !任何时候都只会播放一个音频文件 - 这是应用程序每个部分的一个文件; 除了过渡期间,其中两个可能会逐渐消失。
是否有一种简单的方法可以从底层结构中释放资源;即ArrayBuffers?据我所知,之前的开发人员确实尝试使用SoundJS .removeSound()
方法调用来释放一些内存,但结果并不好。
目前我正在考虑创建一个对象作为所有文件名的注册表,而不是通过清单加载它们 - 单独加载它们并在使用它们时立即将它们删除。但是,我希望这会引起头痛,在播放过程中将一个文件放到另一个文件中。此外,我希望这可能实际上导致类似于图像的问题,其中MobileSafari没有释放分配给图像的内存 - 即使在删除之后。 (正确的解决方法是在删除之前重置图像元素的'src'属性)
是否有人知道在针对iPad的网络应用中加载如此大量数据的可靠解决方法?
答案 0 :(得分:2)
测试SoundJS已经显示出一些iPad无法正常释放内存的问题。不幸的是,从图书馆的角度来看,我们无能为力。
如果您一次只播放1个声音,我建议您只在需要时加载它们并在使用后将其删除。你会发现最大的问题就是等待加载声音,所以你可能想要实现你期望使用的下一个声音的智能预加载(意味着你总是加载当前和下一个声音)。从理论上讲,这可以让你低于iPad 16 MB的内存限制。但是,如果iPad拒绝释放内存,您可能需要引入某种形式的缓存清除。
另一个解决方案是通过有损压缩来减小文件大小,这听起来已经尝试过了。
第三种选择可能是实现某种形式的流媒体音频,但这不是SoundJS可以帮助的。
希望有所帮助。