内存管理
对于游戏中的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()
{
//清空scene
clearAllScene();
//清空app
if(_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();
}