cocos2d-x|Cocos2d-x粒子系统的优化探究

【cocos2d-x|Cocos2d-x粒子系统的优化探究】一般我们创建粒子的做法:

auto particle = ParticleSystemQuad::create("Particles/Explosion.plist"); ...

那么在引擎中是怎么样的一个表现呢?
我们来看下Cocos2d-x4.0的代码(其实我看的这部分3.0版本也是一样的):
ParticleSystemQuad * ParticleSystemQuad::create(const std::string& filename) { ParticleSystemQuad *ret = new (std::nothrow) ParticleSystemQuad(); if (ret && ret->initWithFile(filename)) { ret->autorelease(); return ret; } CC_SAFE_DELETE(ret); return ret; }

因为ParticleSystemQuad继承于ParticleSystem,所以看ParticleSystem的initWithFile
bool ParticleSystem::initWithFile(const std::string& plistFile) { bool ret = false; _plistFile = FileUtils::getInstance()->fullPathForFilename(plistFile); ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(_plistFile); CCASSERT( !dict.empty(), "Particles: file not found"); // FIXME: compute path from a path, should define a function somewhere to do it string listFilePath = plistFile; if (listFilePath.find('/') != string::npos) { listFilePath = listFilePath.substr(0, listFilePath.rfind('/') + 1); ret = this->initWithDictionary(dict, listFilePath); } else { ret = this->initWithDictionary(dict, ""); }return ret; }

要知道FileUtils的fullPathForFilename只会缓存文件路径,而getValueMapFromFile不会缓存文件的数据,所以试图缓存ValueMap的做法自然行不通了。
难道要改引擎?当然不用,看下面的代码
ParticleSystemQuad * ParticleSystemQuad::create(ValueMap &dictionary) { ParticleSystemQuad *ret = new (std::nothrow) ParticleSystemQuad(); if (ret && ret->initWithDictionary(dictionary)) { ret->autorelease(); return ret; } CC_SAFE_DELETE(ret); return ret; }

发现create的重载方法是传入一个ValueMap,那你就懂得怎么做了吧?
auto fileUtil = FileUtils::getInstance(); auto plistData = https://www.it610.com/article/fileUtil->getValueMapFromFile("vanishingPoint.plist"); auto stars = ParticleSystemQuad::create(plistData);

以上的做法优势很明显,有频繁操作的话,只需将plistData保存下来即可,那样就不用频繁读取文件了。
另外进一步考虑到占用内存、热更等问题,则要额外处理,那我这篇文字就算是抛砖引玉吧。
其实粒子系统在我所知的引擎当中,对于移动端一直都是cpu和gpu杀手,最好的优化手段自然是不用或少用,大家想追求的肆意用粒子系统的时代还没到来,所以还是老老实实用动画代替粒子吧
参考链接

    推荐阅读