推荐阅读:注:以下文章是针对egret来写的,其他引擎可参考思想,实现或许会有差异
我们这边的分多个场景,比如说我们登录场景资源,是另外分开的一个json配置的,到我们切换场景的时候就会根据那个配置的url来RES.destory对应的资源
比如游戏主场景,我们游戏是切块地图的,我们在进入游戏的时候会把地图资源存在一个map对象里面,每当切换场景要切地图的时候,我们就会检索这个map对象,来销毁地图加载新的地图
- 模型,特效资源。(加载、销毁管理,纳入计数器。定时检测,如果资源销毁时间超过5分钟,则会判定为资源可回收)
2.地图资源(主要是场景图片)。 (场景移动过程中,会把当前使用到的图片都放入一个map中存起来,(暂定为1分钟检测一次)定时检测,移除超过玩家9宫格范围外 2个格子的其它地图资源)
3.UI图片,图标资源。(对图片资源进行管理,界面打开的时候,会进场注册使用,计数+1,界面关闭的时候,会进入销毁逻辑,计数-1 ,定时检测,当前使用图片计数为0 的图片资源 。 不过现在这个地方还是会有问题:主要在Render 列表的地方)
我的方法就比较简单粗暴,直接添加到舞台上的时候弄个标记,不在舞台上了去掉,直接读RES中的缓存池,过滤不在舞台上的,其他全干掉
通用性高的资源,加入公共图集,独立性强的UI,放在自己的模块中即可。
比如这是common图集,我们会分的比较细一点。 比如这是common图集,我们会分的比较细一点。
他的做法是,除了加入引用计数之外,还加入一个最后引用的时间戳,每次检测的时候处理看引用计数之外,还看间隔的时间,如果最近引用的时间太近的话,也不释放
一般公共的图片,应该都有最近的引用时间戳,所以应该也不会被释放。
此外有一位大神做的比较厉害的地方:
对象池技术:(游戏中基本所有对象,都通过对象池来进行创建。包括但不局限于:文本、图片、各种对象), 基本把laya的底层代码,都进行了相关修改