新年干货 CocosCreator 开源 UILoader(如何优雅的加载和释放资源) 二

第一篇的地址:
http://forum.cocos.com/t/cocoscreator-uiloader-0-0-1/54894

1.场景切换如何释放资源

如果涉及多个场景的切换,那么资源释放的时机也比较重要,如果释放不对,可能会造成纹理的丢失。那么使用 UILoader 可以避免这种问题。只需要在常驻节点上监听两个事件就好了。

cc.director.on(cc.Director.EVENT_BEFORE_SCENE_LOADING, UILoader.beforeSceneLoading);
         
cc.director.on(cc.Director.EVENT_AFTER_SCENE_LAUNCH, UILoader.afterSceneLaunch);

可以看到,资源被释放的很干净。

2.如何使部分资源在一段时间内常驻内存,不释放。(本文写成静态资源)

在游戏中也会存在需要这个资源在一段时间内不要销毁。比如棋牌游戏开发中的麻将牌。那么 UILoader 也有方法提供这种机制。例如使用一张静态的纹理去更换纹理

onLoaderPrefabClick3 () {
        let spriteNode = this.node.getChildByName("icon_sprite");
        UILoader.loadStaticRes("HotProgress2", cc.SpriteFrame, "hall",(spriteFrame) => {
            UILoader.replaceSpriteTexture(spriteNode, spriteFrame);
        })
    },

3. 如何释放静态资源。

在某个时候可能不需要使用静态资源了。比如。麻将游戏从游戏中切换到大厅,那么这个资源应该要释放掉。

UILoader.releaseStaticRes();

4. 播放音乐音效后,优雅 的是否资源。

在游戏中比如一个音效播放完了,可能不需要再使用。那么此时应该是否掉。音乐也是如此。

UILoader.playMusic(cc.url.raw("resources/man_0_chat_6.ogg"),true, 0.5);
 
UILoader.playEffect(cc.url.raw("resources/man_0_chat_5.ogg"), 0.5);

后面还会进行更新 UILoader, 请有意者保持关注。

最后附上 UILoader 开源地址

https://github.com/1083921307/UILoader

博客地址:

http://www.wazhlh.com/

22赞

赞 

赞,官方应该和作者商量把这个插件收录到基本的性能检测里面

1赞

粗略浏览全文,所以该插件解决的痛点是,把内存显示在左下角以及把资源有关的加载和释放进行语法糖UILorder的封装么?
另外建议发帖人把代码放进markdown的代码语法中,方便拷贝和阅读。

loadRes(path, type, callback) {
        cc.loader.loadRes(path, type, (err, asset) => {
            if (err) {
                cc.log(`[资源加载] 错误 ${err}`);
                return;
            }
            callback(asset)
        });
    },

看到这没有?如果我上层在运行期调用,出错的时候:上层的调用生生被截断了,不严谨啊。
API应该顾虑到上层的所有情况(起码把err返回去),而并不是语法糖。

赞赞赞

感谢分享

mark

后面还出有TS版本的 UILoader 开源

没有必要把错误返回去。

为啥都说是语法糖呢。这是一套管理加载和释放资源的东西。

没注意,论坛支持markdown 语法。会重新写一下的。

楼主, 问下这里的内存是怎么统计出来的? 用的什么工具?

好吧, 研究了楼主的源码,
先行谢过了

计算的纹理。 相关代码我也放出来的。

正准备研究下内存管理这方面的呢 你就来啦 太及时了 大赞一个:2:

ts版本大概什么时候可以出

最近几天

所以楼主采用的是,引用计数来管理资源吗?那我有点疑问,
0. loadStaticRes 和 releaseStaticRes 是可多次调用的吗?比如多个代码分别 load 了一个相同的 static res,只有一起 release 掉才会真正释放。

  1. 如果用户自己持有了某个资源,是不是这个资源就还是会被错误释放?除非用户手动调用 loadStaticRes 和 releaseStaticRes。staticRes 底层会进行 retain/release。
  2. 如果用户自己定义了组件 A,能够关联一些资源到场景中,那组件 A 内部需要对资源进行 retain/release 吗?还是说组件 A 的使用者在修改组件 A 关联的资源时,需要额外调用 loadStaticRes 和 releaseStaticRes?