Cocos Creator内存优化记录

2,617 阅读2分钟

写在前面

今天去面试,该公司是做电视游戏的,对内存要求比较严格(因为现在的智能电视一般内存都不大)

问题

假如游戏开发中流程是一个主场景,其他layer都是在主场景上加载的预制体,打开几个预制体(假如3个,预制体A,预制体B,预制体C)后可能内存就不多了,此时需要优化内存,怎么做?

我的想法

资源的动态加载和动态释放,cc.loader.loadRes和cc.loader.release,把不用的预制体或者不在屏幕上显示的节点及时释放

接着问

那cc.loader.release释放了节点后,该节点对应的贴图等资源还是不会释放,会继续占用内存,怎么办?

回答

cc.loader.getDependsRecursively,通过cc.loader.release和cc.loader.getDependsRecursively配合使用,release在释放预制体时,只是释放该预制体的json文件,引用的贴图等资源是不会释放的,此时需要用getDependsRecursively来获取该预制体的全部引用的资源,再用release释放全部资源即可;

    //释放this.prefab节点内存
    let res = cc.loader.getDependsRecirsovely(this.prefab);
    cc.loader.release(res);

接着问

那如果其他节点引用了该预制资源的某个贴图资源,那么这个节点的spriteFrame就会丢失,就变黑了,怎么防止这种结果出现?

想法

当时没有细想,回来想想,是不是可以实现一个资源管理的引用计数,和cocos2dx的内存管理机制类似,如果有人用了该贴图资源,就给引用计数+1,没有引用计数的时候自动释放,那么在释放预制体的时候,只需要把引用计数-1即可

写在最后

平时写cocos的时候,不太关注性能,内存等问题,因为现在的设备硬件都比较好,但作为开发人员,还是应该在注重游戏表现的过程中,不断优化性能和内存,精益求精,给自己提个醒吧