我目前正在开发一个利用SoundJS的应用程序。在发现它在 iPad 上无法正常工作后,我继承了代码库 - 问题是它创建了大约 16 个 MP3 文件的清单,总计约 35.7mb。这显然会导致 iPad 出现问题,并在 16mb 时崩溃。
根据诊断和使用日志,崩溃日志显示这是由于每个进程限制造成的。
我已经对 SoundJS 的底层结构进行了一些挖掘,可以看到它的默认行为是通过 XHR 使用 WebAudio。然后将其解析为 ArrayBuffer(或 ArrayBuffer 数组)。
目前这意味着,在预加载之后,我们在 ArrayBuffers 中有 35.7mb 的数据——不好。这是在压缩文件大小之后!任何时候都只会播放一个音频文件——这是应用程序的每个部分一个文件;除了在过渡期间,两个可能会逐渐淡入彼此。
有没有一种简单的方法可以从底层结构中释放资源?即ArrayBuffers?据我所知,之前的开发人员确实尝试使用对 SoundJS.removeSound()
方法的调用来释放一些内存,但结果并不好。
目前,我正在考虑创建一个对象作为所有文件名的注册表,而不是通过清单加载它们 - 单独加载它们并在使用它们时立即删除它们。但是,我预计这会在播放期间将一个文件缓入另一个文件时引起头痛。此外,我预计这实际上可能会导致类似于图像的问题,其中 MobileSafari 没有释放分配给图像的内存 - 即使在删除之后也是如此。(正确的解决方法是在删除之前重置图像元素的 'src' 属性)
有谁知道在针对 iPad 的网络应用程序中加载如此大量数据的万无一失的解决方法?