有效降低内存峰值防止过高及其原理分析
2015-09-08 20:30
281 查看
1.内存峰值过高是为什么?
在cocos2d中因为我们在一帧内创建的临时对象太多了,这些对象是占用内存的罪魁祸首,而这些对象正常情况下就算是用不到的对象也是是要在一帧结束的时候才会释放,所以就导致了内存峰值过高。
2.解决思路
所以我们要解决一个问题,即:让用不到对象不要在一帧结束的时候才释放,而是让其提前释放,比如说超过其作用域的时候马上释放或者用不到的时候马上释放,这样就不会占用内存了。我这里采用的方法就是前者:用不到的变量在超过其作用域的时候就释放。
3.怎么释放,以及为什么这样有效果?
释放的方法很简单,即:在函数里面创建对象之前先创建一个自动释放池。函数第一句创建了一个自动释放池,在创建的时候,这个自动释放池会被追加到了释放池栈_releasePoolStack。又因为在创建其他普通对象的时候会又一个autorelease()函数,这个函数会将新创建的对象添加到我们刚才创建的自动释放池(最新的)里面去。
当作用域结束后会调用对象的析构函数,而新加的自动释放池的作用域也是结束了,所以会调用这个自动释放池的析构函数。
自动释放池的~autoreleasePool函数(析构函数),会将这个自动释放池里面的所有对象都release一遍,所以那些用不到的变量就会自动释放掉了,
这样就实现了自动释放对象的功能。
综上所述,答案就是:
在函数创建对象之前先创建一个自动释放池,因为这个释放池是函数里面的局部变量,所以当函数结束的时候,会调用他的析构函数,而普通的情况是在一帧结束的时候才会调用自动释放池(不是这个,普通的)的析构函数。基于这个背景来分析一下为什么。
在cocos2d中因为我们在一帧内创建的临时对象太多了,这些对象是占用内存的罪魁祸首,而这些对象正常情况下就算是用不到的对象也是是要在一帧结束的时候才会释放,所以就导致了内存峰值过高。
2.解决思路
所以我们要解决一个问题,即:让用不到对象不要在一帧结束的时候才释放,而是让其提前释放,比如说超过其作用域的时候马上释放或者用不到的时候马上释放,这样就不会占用内存了。我这里采用的方法就是前者:用不到的变量在超过其作用域的时候就释放。
3.怎么释放,以及为什么这样有效果?
释放的方法很简单,即:在函数里面创建对象之前先创建一个自动释放池。函数第一句创建了一个自动释放池,在创建的时候,这个自动释放池会被追加到了释放池栈_releasePoolStack。又因为在创建其他普通对象的时候会又一个autorelease()函数,这个函数会将新创建的对象添加到我们刚才创建的自动释放池(最新的)里面去。
当作用域结束后会调用对象的析构函数,而新加的自动释放池的作用域也是结束了,所以会调用这个自动释放池的析构函数。
自动释放池的~autoreleasePool函数(析构函数),会将这个自动释放池里面的所有对象都release一遍,所以那些用不到的变量就会自动释放掉了,
这样就实现了自动释放对象的功能。
综上所述,答案就是:
在函数创建对象之前先创建一个自动释放池,因为这个释放池是函数里面的局部变量,所以当函数结束的时候,会调用他的析构函数,而普通的情况是在一帧结束的时候才会调用自动释放池(不是这个,普通的)的析构函数。基于这个背景来分析一下为什么。
相关文章推荐
- C++11系列学习之六-----for
- 【英语】Bingo口语笔记(72) - play系列
- HDU4403-模拟、数学
- android开启远程调试
- KVO实现机制
- HDU 3572Task Schedule(网络流)
- Tab在不同页面的隐藏与不隐藏问题。
- LINUX 任务计划 应用总结
- POJ 1459:Power Network 能源网络
- MATLAB脚本图片格式eps转pdf
- "Gdiplus::GdiplusBase::operator new 函数不接受3 个参数"问题的处理
- POJ 1459:Power Network 能源网络
- android app引导页(背景图片切换加各个页面动画效果)
- 通过迁移的方式解决Active Directory服务器问题之6
- Linux中find常见用法
- python 函数式编程和高阶函数的概念
- Arash-《Tempation》
- 1034. 有理数四则运算(20)
- 解决Win7下一个VC++6.0您不能直接打开多个project问题
- Linux Shell编程(2): for while