有效降低内存峰值防止过高及其原理分析

1.内存峰值过高是为什么?

  在cocos2d中因为我们在一帧内创建的临时对象太多了,这些对象是占用内存的罪魁祸首,而这些对象正常情况下就算是用不到的对象也是是要在一帧结束的时候才会释放,所以就导致了内存峰值过高。

2.解决思路

  所以我们要解决一个问题,即:让用不到对象不要在一帧结束的时候才释放,而是让其提前释放,比如说超过其作用域的时候马上释放或者用不到的时候马上释放,这样就不会占用内存了。我这里采用的方法就是前者:用不到的变量在超过其作用域的时候就释放。

3.怎么释放,以及为什么这样有效果?

  释放的方法很简单,即:在函数里面创建对象之前先创建一个自动释放池。函数第一句创建了一个自动释放池,在创建的时候,这个自动释放池会被追加到了释放池栈_releasePoolStack。又因为在创建其他普通对象的时候会又一个autorelease()函数,这个函数会将新创建的对象添加到我们刚才创建的自动释放池(最新的)里面去。

当作用域结束后会调用对象的析构函数,而新加的自动释放池的作用域也是结束了,所以会调用这个自动释放池的析构函数。

自动释放池的~autoreleasePool函数(析构函数),会将这个自动释放池里面的所有对象都release一遍,所以那些用不到的变量就会自动释放掉了,

这样就实现了自动释放对象的功能。

综上所述,答案就是:

在函数创建对象之前先创建一个自动释放池,因为这个释放池是函数里面的局部变量,所以当函数结束的时候,会调用他的析构函数,而普通的情况是在一帧结束的时候才会调用自动释放池(不是这个,普通的)的析构函数。基于这个背景来分析一下为什么。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值