cocos内存泄漏以及优化问题
这几天疯狂的赶进度
到了今天晚上突然服务端和美工告诉我
进度都卡住了。
实在无奈就上来更篇博客。
最近遇到几个好玩的事情,关于内存泄漏
要知道当时开发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());
最好是在场景切换的时候去释放内存- 上一篇: C头文件
- 下一篇: String 字符串截取拼装换行 接近Textview换行问题