cocos内存泄漏以及优化问题

来源:互联网 发布:淘宝修改标题必须下架 编辑:程序博客网 时间:2024/06/16 08:53

这几天疯狂的赶进度

到了今天晚上突然服务端和美工告诉我

进度都卡住了。

实在无奈就上来更篇博客。


最近遇到几个好玩的事情,关于内存泄漏

要知道当时开发unity的时候很少去管内存这个东西,可能是unity的内存池做的比较好,也可能是c#没有c++如此繁琐的管理内存,又或许是在unity里面很少new等等原因。

很多原因导致我去管底层的东西,而出现问题之后也只能硬着头皮上了。

提前说下,最近把工程放在xcode上开发,一个是比较方面发布ios,另一个就是自带插件工具实在要比vs好用的多。


某天,我运行的程序调试的时候,对门的大兄弟倒水喝茶偶然看见我的cpu到了40,内存已过100m

就给我科普了下,最好是不要超过90。

之前我是一直没管内存的问题的,ui基本上是用cocos studio做的,着实是为了方便。

后来想去优化内存总是压不下来,所以我后来都不用cocos studio去做了,全手工代码~~


这里我提几个原理和解决方案

1.内存的占用绝大部分是来源于图片和音频,一个png图片大小1m不到可以跑到10-30m的缓存,原因是加载,渲染。有人说只有2倍,显然不止。

2.只要是加入到缓存的资源,不去手动释放就会永远放在那里。

3.cocos studio加载的资源,暂时还找不到去释放的函数,尝试过让noot指针delete,报错,所以如果有,请告诉我,如果你也没发现,尽量少用~~

4.尽量让你的内存《90m,图片打包成图集,多图集,多加载,多释放。

5.音频请根据不同平台优化,也是需要清楚缓存的

6.尽量释放所有内存,除非是频繁使用的一些模块,譬如背包之类的,否则影响不了太多的用户体验。


这里我说几个解决方案。

1.单图打包成图集,好处1:app包资源小,2:释放和加载资源方便

2.释放函数为:

  SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();

        Director::getInstance()->getTextureCache()->removeUnusedTextures();

        Director::getInstance()->getTextureCache()->removeAllTextures();

请按这个顺序去释放。

3.背景图请尽量用jpg

4.如何查看内存泄漏

我使用的工具是xcode自带的Leaks,超级好用。

注意new出来的指针请务必delete。顺便吐槽下c++11都出来这么久了,cocos更新下智能指针会死哦~





后面的修改:

考虑到之前的释放方式有些不太好,后来又更改了

        //内存优化 ,第一个是释放当前场景

        this->removeFromParentAndCleanup(true);

        AnimationCache::destroyInstance();

        SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();

        Director::getInstance()->getTextureCache()->removeAllTextures();

        Director::getInstance()->replaceScene(HelloWorld::createScene());

最好是在场景切换的时候去释放内存
0 0
原创粉丝点击