内存管理
来源:互联网 发布:最好的网络机顶盒 编辑:程序博客网 时间: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
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 概率主题模型简介 Introduction to Probabilistic Topic Models
- 网站构建技术了解
- [教程]解决真机调试时Eclipse DDMS上打不开/data目录的问题
- 计算两点间的距离_Java_杭电ACM2001
- AFG与AWG的比较
- 内存管理
- TestNG+Ant 测试报告美化
- iOS进行单元测试OCUnit+xctool
- windows Eclipse远程连接linux hadoop2.3.0伪分布式
- 一次mysql数据库迁移的过程记录
- LNUX 介绍各个文件目录
- 如何用Python写一个贪吃蛇AI
- Android开发(28) Fragment生命周期
- javascript基础