内存管理

来源:互联网 发布:最好的网络机顶盒 编辑:程序博客网 时间:2024/06/03 18:23
内存管理
对于游戏中的new ,分两种情况,一种是没有加入到场景中,一种是加入到了场景树中。第一种情况,需要用户自己delete掉,而第二种我们可以在类的析构中进行删除。先看主要的两类,scene与sprite.
bool AppDelegate::applicationEnter(){//初始化全局数据  //场景切换  double animationInterval = 1.0 / 60;Engine::getInstance()->setAnimationInterval(animationInterval);//AudioEngine::getInstance()->playMusic("008.mp3");//AudioEngine::getInstance()->playSoundOnce("correct.wav");Scene* scene = new GameScene();Engine::getInstance()->changeScene(scene);return true;}
它的删除在场景切换中,游戏结束时完成。
void Engine::changeScene(Scene* scene){Scene* lastScene = popScene();if (lastScene!= NULL){delete lastScene;}_SceneManager.push_back(scene);}
void Engine::clearAllScene(){if (_SceneManager.size() > 0){std::vector<Scene*>::iterator itChild = _SceneManager.begin();while (itChild != _SceneManager.end()){delete (*itChild);  //删除缓存的scene++itChild;}_SceneManager.clear();//清空列表}}

void Engine::exitClearEnvironment(){//清空sceneclearAllScene();//清空appif(_gameApp){delete _gameApp;_gameApp = NULL;}FileUtils::destroy();TextureManager::destroy();Renderer::destroy();AudioEngine::destroy();}

再来看sprite.
GameScene::GameScene(){Size winSize = Engine::getInstance()->getDesignSize();Sprite* spr1 = new Sprite("house.jpg");spr1->setPosition(Point(winSize.width* 0.5,winSize.height * 0.3));//spr1->setAnchor(Point(0.5,0.1));spr1->setSkewX(45);addChild(spr1,1);Sprite* spr2 = new Sprite("rock1.png");spr2->setPosition(Point(winSize.width* 0.5,winSize.height * 0.5));spr2->setOpacity(0.8f);addChild(spr2,2);}

它在scene中删除。
Scene::~Scene(){_root.removeAllChildren();}

void Node::removeNodeAndChild(Node* node){if (node->getChildren()->size() > 0)//删除当前节点子节点{std::vector<Node*>::iterator itChild = node->getChildren()->begin();while (itChild != node->getChildren()->end()){removeNodeAndChild(*itChild);//递归删除子节点的子节点++itChild;}node->getChildren()->clear();//清空列表}delete node;//删除当前节点}void Node::removeAllChildren(){std::vector<Node*>::iterator itChild = getChildren()->begin();while (itChild != getChildren()->end()){removeNodeAndChild(*itChild);//递归删除子节点的子节点++itChild;}getChildren()->clear();//清空列表}

sprite结束时,我们可以选择是否清空纹理缓存。
Sprite::~Sprite(){if (!_isCacheTexture){TextureManager::getInstance()->removeTexture(_texturePath.c_str());}}

void TextureManager::removeTexture(const char * imagePath){TextureCache::iterator it = _textureCache.find(imagePath);if (it != _textureCache.end()){glDeleteTextures(1, &it->second._textureID);_textureCache.erase(it);}}void TextureManager::removeAllTexture(){TextureCache::iterator it = _textureCache.begin();while (it != _textureCache.end()){glDeleteTextures(1, &it->second._textureID);++it;}_textureCache.clear();}



0 0
原创粉丝点击