Egret社区

关于内存和缓存的疑惑

2017-9-16 12:44
2125915
1银子
1.通过 RES.loadGroup 用该方式可以从网络中获取游戏资源,此时这些资源是在内存里还是以文件的形式在某个地方,占不占用内存?
RES.getRes这个是读取已缓存的资源,是否此时才解析文件占用内存呢?

2.RES.destroyRes 这个接口可以销毁对应的一组资源或某个资源,如果调用了该接口,但是资源正在被使用,比如某个位图对象仍在显示列表中,那么会有什么效果?
如果有2个group都包含了同一个资源,销毁其中一个group会有什么现象,如果我有2个group "ui1"和"ui2",他们都包含"bg",我创建第一个ui的时候显示loadgroup(ui1)
之后切换界面前创建了ui2,loadgroup("ui2"),然后把ui2加入显示列表,删除了ui1对象并且RES.destroyRes("ui1"),此时会发生什么现象?
因为我打算设计成一个界面对应一个group分组,然后当第二个界面创建完毕的时候销毁第一个界面用到的资源,可是2个group里可能有公用元素。


3.针对第一点的疑惑,如果缓存和内存是分开的,RES.destroyRes的时候是将内存里的资源删除还是将缓存的文件也删除,如果我只想删除内存里的位图,不想删除缓存的文件来避免下次重新从网络获取,我该如何处理呢?



最佳答案

查看完整内容

这个问题很多开发者也会疑惑,这里统一回答一下 1、RES.loadGroup完毕的时候你可以理解为已经占用内存,所以RES.getRes 只是获得一个引用而已 2、第二个需求,默认情况下直接使用即可,RES.destroyRes("ui1")并不会销毁另一个组的资源;当然你可以选择强制销毁另一个组的资源,需要使用第二个参数RES.destroyRes("ui1",true) 3、RES.destroyRes 的时候 Egret 内部的内存会被释放掉,但是浏览器缓存还是存在的,也就是说,如果你 ...
分享到 :
11 人收藏

15 个回复

倒序浏览
dily3825002  社区管理员 | 2017-9-16 12:44:25
这个问题很多开发者也会疑惑,这里统一回答一下

1、RES.loadGroup完毕的时候你可以理解为已经占用内存,所以RES.getRes 只是获得一个引用而已
2、第二个需求,默认情况下直接使用即可,RES.destroyRes("ui1")并不会销毁另一个组的资源;当然你可以选择强制销毁另一个组的资源,需要使用第二个参数RES.destroyRes("ui1",true)
3、RES.destroyRes 的时候 Egret 内部的内存会被释放掉,但是浏览器缓存还是存在的,也就是说,如果你使用RES.getResByUrl 的话,其实不用重新加载而是直接从浏览器缓存中直接获得

欢迎大家交流讨论

点评

666  发表于 2018-9-29 10:06
666  发表于 2018-9-27 15:41
666  发表于 2018-9-12 13:13
666  发表于 2017-9-30 11:56
哈森森  圆转纯熟 | 2017-9-18 12:59:51
我这几天也越到了。关于res资源加载的问题。请大神解析以下,可能出问题的地方。
如下:

问题描述:
      一款游戏,在更新了连接之后。7~8天是正常可以加载资源的,8天以后,就有部分玩家反应。提示加载资源错误。
  侦听到这个事件:     RES.addEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR, this.onResourceLoadError, this);

      发了同一游戏的,另一个连接。给这一部分进不取游戏的玩家,他们却可以正常游戏。(有苹果手机,有三星手机)

请问,大神。这可能是什么缘由,引起的。
图片的大小:都在1024以下。
萝卜书生  登堂入室 | 2017-9-18 14:54:35
感谢
tainmen  登堂入室 | 2017-9-21 14:32:02
dily3825002 发表于 2017-9-16 12:44
这个问题很多开发者也会疑惑,这里统一回答一下

1、RES.loadGroup完毕的时候你可以理解为已经占用内存,所 ...

关于1,实测我在首次大量循环调用getRes完成帧动画的时候会出现卡顿,之后再次调用播放同样的动画,并不会再发生卡顿,为什么会这样呢?
萝卜书生  登堂入室 | 2017-10-9 22:35:32
dily3825002 发表于 2017-9-16 12:44
这个问题很多开发者也会疑惑,这里统一回答一下

1、RES.loadGroup完毕的时候你可以理解为已经占用内存,所 ...

这个问题升级了。假设游戏里有一张地图,地图上动态加载一些动画和图片,此时弹出一个界面,这个界面里可能也用到了相同的图片或动画。当界面关闭时,destory了该界面用到的动画和图片。那么对地图上已显示的对象会造成什么影响。我是否要引入计数器机制,当资源引用计数为0时才将其destory,还是说egret已经考虑到了这种情况,有解决方案?
萝卜书生  登堂入室 | 2017-10-9 23:06:47
dily3825002 发表于 2017-9-16 12:44
这个问题很多开发者也会疑惑,这里统一回答一下

1、RES.loadGroup完毕的时候你可以理解为已经占用内存,所 ...

我怕我问的不清楚,补充一下,我翻看了RES里销毁资源的代码,销毁非group时是走这一步的。
                let type:string = this.resConfig.getType(name);
                if (type == "") {
                    type = this._loadedUrlTypes[name];
                    if (type == null || type == "") {
                        return false;
                    }
                    delete this._loadedUrlTypes[name];
                    let analyzer:AnalyzerBase = this.$getAnalyzerByType(type);
                    analyzer.destroyRes(name);
                    return true;
                }
                let item = this.resConfig.getRawResourceItem(name);
                item.loaded = false;
                let analyzer = this.$getAnalyzerByType(type);
                let result = analyzer.destroyRes(name);
                this.removeLoadedGroupsByItemName(item.name);
                return result;
也就是说,此时对应的图片肯定是从内存里删掉了。那么此时有2个疑问:1.图片资源被释放了,stage里已创建的引用了这张图片的对象还能正确显示吗(如果可以显示,我想知道为什么图片被释放了还能正常显示,引用的纹理何时真正得到释放)?2.新建的显示对象如果引用了这张图片还能正常显示吗?
dily3825002  社区管理员 | 2017-10-12 11:39:17
tainmen 发表于 2017-9-21 14:32
关于1,实测我在首次大量循环调用getRes完成帧动画的时候会出现卡顿,之后再次调用播放同样的动画,并不 ...

这个问题应该看代码更清楚一些
dily3825002  社区管理员 | 2017-10-12 12:05:34
萝卜书生 发表于 2017-10-9 22:35
这个问题升级了。假设游戏里有一张地图,地图上动态加载一些动画和图片,此时弹出一个界面,这个界面里可 ...

这个其实涉及到了资源合理划分问题,公共素材放到公共组里,其它素材单独分组加载,这样就不会遇到你所说的问题
萝卜书生  登堂入室 | 2017-10-13 09:21:53
dily3825002 发表于 2017-10-12 12:05
这个其实涉及到了资源合理划分问题,公共素材放到公共组里,其它素材单独分组加载,这样就不会遇到你所说 ...

好的,我再翻翻源码,琢磨一下,removeLoadedGroupsByItemName这个函数啥意思destoryres的时候会把包含这个资源的分组都删掉么
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部