本文基于cocos2dx 3.2
cocos2dx 提供了一个基于xml的用户数据存贮类,给基于cocos2dx开发的用户数据存贮,这个类名就是UserDefault,在cocos2dx 2.x中是CCUserDefault。我的程序用的就是这个,但是最近老出错,于是分析源代码,发现了一个让我震惊的东西。经过分析,发现用UserDefault每读写一次数据,都会创建一个tinyxml对象,然后读取xml内容。如果是写数据,还是写入xml一次。下面是对应的代码:
读取key,所以各种读取key的操作,都是类似这样。
doubleUserDefault::getDoubleForKey(
const
char*pKey,doubledefaultValue)
{
char*value=nullptr;
tinyxml2::XMLElement*rootNode;
tinyxml2::XMLDocument*doc;
tinyxml2::XMLElement*node;
node=getXMLNodeForKey(pKey,&rootNode,&doc);
// findthenode
if(node&&node->FirstChild())
{
value=( char*)(node->FirstChild()->Value());
}
doubleret=defaultValue;
if(value)
{
ret=utils::atof(value);
}
if(doc)deletedoc;
returnret;
}
关于getXMLNodeForKey的实现
{
char*value=nullptr;
tinyxml2::XMLElement*rootNode;
tinyxml2::XMLDocument*doc;
tinyxml2::XMLElement*node;
node=getXMLNodeForKey(pKey,&rootNode,&doc);
// findthenode
if(node&&node->FirstChild())
{
value=( char*)(node->FirstChild()->Value());
}
doubleret=defaultValue;
if(value)
{
ret=utils::atof(value);
}
if(doc)deletedoc;
returnret;
}
/* *
*definethefunctionsherebecausewedon'twantto
*exportxmlNodePtrandothertypesin"CCUserDefault.h"
*/
statictinyxml2::XMLElement*getXMLNodeForKey( checkthekeyvalue if(!pKey)
{
returnnullptr;
}
do
{
tinyxml2::XMLDocument*xmlDoc= newtinyxml2::XMLDocument();
*doc=xmlDoc;
std:: stringxmlBuffer=FileUtils::getInstance()->getStringFromFile(UserDefault::getInstance()->getXMLFilePath());
if(xmlBuffer.empty())
{
CCLOG("cannotreadxmlfile");
break;
}
xmlDoc->Parse(xmlBuffer.c_str(),xmlBuffer.size());
getrootnode
*rootNode=xmlDoc->RootElement();
if(nullptr==*rootNode)
{
CCLOG("readrootnodeerror");
break;
}
curNode=(*rootNode)->FirstChildElement();
while(nullptr!=curNode)
{
char*nodeName=curNode->Value();
if(!strcmp(nodeName,pKey))
{
break;
}
curNode=curNode->NextSiblingElement();
}
} while(0);
returncurNode;
}