CocosCreator-资源加载,释放详解

在以往使用cocos creator过程中,我从来没有对cocoscreator的资源加载释放进行了解。在一次调试的时候,我发现随着游戏时间越来越长,占用内存资源越来越大,所以为了了解cocos的资源加载/释放机制,我测试并整理了以下内容。

1. 静态加载/动态加载

cocos的资源加载方式有静态加载和动态加载。
静态加载即加载的场景,场景上绑定的脚本,图片,字体,spine等资源,脚本上绑定的预制体,图片,字体,spine等资源。
动态加载即通过cc.loader.loadRes,cc.loader.load方法,加载远端服务器或本地resources目录下的资源。
两种加载方式加载的资源会有不同的加载/释放机制。

  • 1.1 静态加载的资源
    静态加载的资源是挂载在场景和预设体的预制体,图片,字体等资源,在场景上和预制体内有不同的释放方式。

    挂载在场景上的资源会根据设置的场景的 AutoRealse 参数进行会自动释放,也包含挂载资源内部的所有资源。所以推荐场景勾选AutoRealse选项.

    Scene的可选项

  • 1.2. 动态加载的资源
    动态加载的资源是通过cc.loader加载的资源。需要自己手动释放。由于动态加载的资源会在cocos底层进行缓存,包括resources目录下资源和远端访问的资源。所以对于我们无需为了节省流量,对这些资源进行缓存管理。而是更应该因为底层缓存了所有的动态加载的资源,需要关注内存占用问题。

Tips:对于联网游戏开发者,需要特别关注玩家头像的清理。

resources目录下的资源为异步加载的资源

2. 资源如何释放

  • 2.1 如果勾选了场景的自动释放资源,对于静态加载的资源,cocos引擎会在底层进行释放。

  • 2.2 使用cc.loader.realse(prefab_path)只会释放其本身prefab资源,其相关联的图片等其他资源不会自动释放,需要手动释放。

  • 2.3 使用cc.loader.realse(cc.loader.getDependsRecursively(prefab_path))可以释放掉其本身和相关的所有资源,但是会因为释放的相关资源正在使用导致闪退,谨慎使用。

3. 释放资源的问题

  • 3.1 Cc.loader.release(cc.loader.getDependsRecursively(xxx))会释放json和图集资源,但是若用了自动图集,会导致图集内的其他资源也被释放了,导致显示出错。

4. 释放资源举例

  • 4.1 释放一个只包含一张图片的预制体,Cc.loader.release(xxx)只会释放一个prefab的json。Cc.loader.release(cc.loader.getDependsRecursively(xxx))会释放prefab,spriteframe,texture的json和texture纹理共4个缓存。

5. 参考链接

ps:可以在loadScene后手动调用cc.sys.garbageCollect(),进行强制GC,但是会造成卡顿。参考链接:cocos官方论坛: cocoscreator 场景切换内存泄漏

总结

    1. 想要释放预制体的json可以使用cc.loader.release(xxx)。
    1. 想要释放预制体及其内部使用的所有资源,则内部资源必须为独有,不与其他预制体和场景共享,但是项目中有很多公用资源,这个实现困难较大。
    1. 想要释放图片的资源,图片必须不能与与其他不相关的图片打在同一图集,且不能被其他功能使用。
    1. 引擎无引用计数机制,所以不会自动清理资源,所以我们可以手动实现引用计数机制,对动态加载的资源进行引用计数。参考链接:https://forum.cocos.com/t/cocos-creator/84793

你可能感兴趣的:(CocosCreator-资源加载,释放详解)