问题描述:
很多封浏览器壳的html app保存显示图片都是使用“data:image/png;base64,……”格式存储或放到img标签的src里面显示。在小图片少数量的情况没有问题,但一多起来就容易引发mobile端的OOM,甚至直接闪退。原因:src里面放的字符串是base64,是整个图片的blob 占的空间的1.5倍的字符串,而img 显示的时候要解析src为图片对象,这个占空间更大。src的值不会因为解析完就会释放,有可能会一直存在,依赖浏览器引擎和src的值是否在其他地方存在(一般在数据源的地方会保存着,所以不会被释放)。
有一种解决方法
原理是拦截url的get 加载本地资源(图片等)替代。
具体操作方法:
-
假设url_base=“http://1.1.1.1/”;
api_url = url_base + “api/”;
local_url = url_base + “local/”; -
浏览器壳启动url=local_url + “index.html”,拦截浏览器的请求,把local_url 的所有请求使用本地的某文件夹下的文件代替。于是img的src就可以填写为local_url + "1.png"的值而不是“data:image/png;base64,……”。
结果:
只要单张图片是可以加载显示,那么浏览器不管加载多少张图片一般都不会出现OOM,因为浏览器引擎只会加载可见的或缓存的部分img。