由于内存消耗过多,MobileSafari崩溃

MobileSafari crashing due to excessive memory consumption

本文关键字:MobileSafari 崩溃 于内存 内存      更新时间:2023-09-26

>我目前正在开发一个利用SoundJS的应用程序。在发现代码库无法在iPad上正常工作后,我继承了代码库 - 问题是它创建了大约16个MP3文件的清单,总计约35.7mb。这显然会导致iPad问题,并且在16mb时崩溃。

崩溃日志显示这是由于诊断和使用情况日志中的每个进程限制造成的。

我已经对SoundJS的底层结构进行了一些深入研究,可以看到它的默认行为是通过XHR使用WebAudio。然后将其解析为 ArrayBuffer(或 ArrayBuffers 数组)。

目前,这意味着,在预加载后,我们在 ArrayBuffers 中有 35.7mb 的数据 - 不好。这是在压缩文件大小之后!任何时候都只会播放一个音频文件 - 这是应用程序的每个部分一个文件;除了在过渡期间,两个可能会相互淡入

有没有一种简单的方法可以从底层结构(即ArrayBuffers)中释放资源?据我所知,以前的开发人员确实尝试使用对 SoundJS .removeSound() 方法的调用来释放一些内存,但结果并不好。

目前,我正在考虑创建一个对象作为所有文件名的注册表,而不是通过清单加载它们 - 单独加载它们并在使用后立即删除它们。但是,我预计这会在播放过程中将一个文件缓和到另一个文件时引起头痛。此外,我希望这实际上可能会导致类似于图像的问题,其中MobileSafari没有释放分配给图像的内存 - 即使在删除后也是如此。(正确的解决方法是在删除之前重置图像元素的"src"属性)

有谁知道在针对iPad的网络应用程序中加载如此大量数据的可靠解决方法?

测试SoundJS显示iPad无法正确释放内存的一些问题。 不幸的是,从图书馆的角度来看,我们对此无能为力。

如果您一次只播放 1 个声音,我建议您仅在需要时加载它们并在使用后删除它们。 您会发现最大的问题是等待声音加载,因此您可能希望实现您期望使用的下一个声音的智能预加载(这意味着您始终加载当前和下一个声音)。 从理论上讲,这可以使您低于iPad 16 mb内存限制。 但是,如果iPad拒绝释放内存,则可能需要引入某种形式的缓存破坏。

另一种解决方案是通过有损压缩来减小文件大小,这听起来似乎已经尝试过。

第三种选择可能是实现某种形式的流音频,但这不是 SoundJS 可以提供帮助的。

希望有帮助。