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杀手,最好的优化手段自然是不用或少用,大家想追求的肆意用粒子系统的时代还没到来,所以还是老老实实用动画代替粒子吧
参考链接
推荐阅读
- 一粒饥饿不堪的米
- 了解自然大气粒子对气候的影响
- Cesium|Cesium 粒子系统学习
- 一粒米的夙愿
- 《播一粒种子在春天》后感
- 一粒灰尘打败我
- 播下一粒种子
- 谷粒学院|谷粒学院(一)项目介绍
- 一首小诗|一首小诗|春天里
- JniHelper的再说明