cocod2d-x--关于场景切换,CCAction未执行完,仍持有引用造成内存泄漏

本文介绍了一种游戏开发中自定义场景生命周期的方法,通过实现特定的生命周期方法如show(), pause(), resume() 和 close()来避免内存泄漏。尤其是在场景切换过程中,通过暂停和恢复所有动作,确保了内存的有效管理和游戏性能的稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.csdn.net/zlqqhs/article/details/21789481

情况如下:

游戏内战斗界面战斗胜利,弹出胜利窗口,点击窗口中的下一关按钮切换到加载资源场景,

此时游戏处于暂停状态,所有CCAction都处于暂停状态,切换场景时,战斗场景中还有CCAction

未执行完,仍持有执行CCAction对象的一个引用,切换场景后引用不为0,则造成内存泄漏


自己定义每个Scene的生命周期,其父类如下:

  1. #ifndef SCREEN_H 
  2. #define SCREEN_H 
  3.  
  4. #include "cocos2d.h" 
  5.  
  6. using namespace cocos2d; 
  7.  
  8. namespace giant { 
  9.  
  10.     class Screen : public CCScene { 
  11.  
  12.     protected
  13.         int m_width; 
  14.         int m_height; 
  15.  
  16.     protected
  17.         Screen(int width, int height); 
  18.  
  19.     public
  20.         virtual void show() = 0; 
  21.         virtual void close() = 0; 
  22.         virtual void pause() = 0; 
  23.         virtual void resume() = 0; 
  24.  
  25.     }; 
  26.  
  27.  
  28. #endif 
#ifndef SCREEN_H
#define SCREEN_H

#include "cocos2d.h"

using namespace cocos2d;

namespace giant {

	class Screen : public CCScene {

	protected:
		int m_width;
		int m_height;

	protected:
		Screen(int width, int height);

	public:
		virtual void show() = 0;
		virtual void close() = 0;
		virtual void pause() = 0;
		virtual void resume() = 0;

	};

}

#endif

游戏场景进入时调用show(),初始化资源

游戏暂停调用pause(),暂停场景中的更新,包括CCAction

游戏从暂停恢复调用resume(),恢复之前所有暂停的更新

游戏场景退出调用close(),销毁视图,释放内存


调用pause()时执行以下代码:

  1. m_pActionSet = CCDirector::sharedDirector()->getActionManager()->pauseAllRunningActions(); 
  2. m_pActionSet->retain(); 
        m_pActionSet = CCDirector::sharedDirector()->getActionManager()->pauseAllRunningActions();
        m_pActionSet->retain();

调用resume()时执行以下代码:

  1. CCDirector::sharedDirector()->getActionManager()->resumeTargets(m_pActionSet); 
  2. m_pActionSet->release(); 
        CCDirector::sharedDirector()->getActionManager()->resumeTargets(m_pActionSet);
        m_pActionSet->release();

调用close()时执行以下代码:

  1. CCActionManager *pActionManager = CCDirector::sharedDirector()->getActionManager(); 
  2. CCSetIterator iter; 
  3. for (iter = m_pActionSet->begin(); iter != m_pActionSet->end(); ++iter) 
  4.     pActionManager->removeAllActionsFromTarget(*iter); 
  5. m_pActionSet->release(); 
        CCActionManager *pActionManager = CCDirector::sharedDirector()->getActionManager();
        CCSetIterator iter;
        for (iter = m_pActionSet->begin(); iter != m_pActionSet->end(); ++iter)
        {
            pActionManager->removeAllActionsFromTarget(*iter);
        }
        m_pActionSet->release();

通过close()里的操作可以释放CCAction中的引用

http://blog.csdn.net/zlqqhs/article/details/21789481
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值